首页 > 代码库 > java之Calablel Future
java之Calablel Future
java中的Callable接口是为了增强Runnable接口的功能,但它不是Runnable接口的子接口。其中提供call()方法作为线程执行体,但它有两个地方与Runnable的run()方法不同:
1、该方法需要抛出异常;2、该方法可以有返回值。
Callable不能作为Thread的target,其call返回值也不哼直接调用,java中提供Future接口,并由FutureTask类实现该接口和Runnable接口,这样可以用FutureTask类包装Callable接口,并将其作为Thread的targe。
Future的方法:
1、boolean cancel(boolean);取消Future里关联的Callable类;
2、V get();返回Callable中call方法的执行结果,一旦调用该方法则调用该方法的线程会阻塞直到子线程结束;
3、V get(long timeout,TimeUnit unit);在参数指定的时间内如果未返回则抛出TImeoutException。
4、boolean isCancelled();在callable任务正常结束之前被取消则返回true;
5、boolean isDone();callable任务完成则返回true。
//用RtnThread类实现Callable接口,同时由于Callable要指定泛型类型,则需要在实现类的时候指定类型。
class RtnThread implements Callable<Integer>{
public Integer call(){
int i = 0 ;
for(; i < 100 ; i++){
System.out.println(Thread.currentThread().getName() + " 的循环变量i的值:" + i);
}
return i;
}
}
public class CallableTest {
public static void main(String[] args) {
RtnThread rt = new RtnThread();
FutureTask<Integer> task = new FutureTask<Integer>(rt);
for(int i = 0 ; i < 100 ;i++){
System.out.println("在主线程,i为:" + i );
if(i == 20){
new Thread(task,"有返回值的线程").start();
try {
System.out.println("子线程的返回值:" + task.get());//调用task获得其返回值,这会导致主线程可能被阻塞。
}catch (Exception e){
}
}
}
}
}
java之Calablel Future
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。