码迷,mamicode.com
首页 > 编程语言 > 详细

java之Calablel Future

时间:2017-01-12 22:25:09      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:包装   sys   task   返回   ring   nbsp   color   try   ++   

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

标签:包装   sys   task   返回   ring   nbsp   color   try   ++   

原文地址:http://www.cnblogs.com/world-for-gold/p/6279918.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!