标签:包装 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){
}
}
}
}
}
标签:包装 sys task 返回 ring nbsp color try ++
原文地址:http://www.cnblogs.com/world-for-gold/p/6279918.html