Callable和Future创建线程
2015-01-18 16:40
295 查看
java5开始,提供了Callable接口,该接口是Runnable的增强版本,提供了一个call()方法作为执行体,但是call()方法比run()方法功能更强大。
call():有返回值,可以声明抛出异常.
java5提供FutureTask接口来代表Callable接口里面的call方法返回值,并提供了一个FutureTask的实现类,该实现类实现了Runnable接口,可以作为Thread类的target.FutureTask有如下方法:
get():返回任务Callable的call方法的返回值,调用该方法导致程序阻塞,必须等到子线程程序结束以后才会得到返回值。
get(long timeout,
TimeUnit unit) 最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。超时会报异常。
以下示例创建一个线程,并且获得线程的返回值
package com.itcast.heima2;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThirdThread implements Callable<Integer>{
@Override
public Integer call() throws Exception {
int i=0;
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+" 的循环变量i的值:"+i);
}
return i;
}
public static void main(String[] args) {
ThirdThread thirdThread=new ThirdThread();
FutureTask<Integer>future=new FutureTask<Integer>(thirdThread);
for(int i=1;i<=40;i++){
System.out.println(Thread.currentThread().getName()+" 的循环变量i的值:"+i);
if(i==20){
new Thread(future).start();
}
}
try {
System.out.println(" BEGIN " );
System.out.println("子线程的返回值是:"+future.get());
System.out.println(" OVER ");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
由于在主线程里面用get()方法要获取子线程运行接口,主线程最后会阻塞,直到子线程call方法运行结束并返回为止。
call():有返回值,可以声明抛出异常.
java5提供FutureTask接口来代表Callable接口里面的call方法返回值,并提供了一个FutureTask的实现类,该实现类实现了Runnable接口,可以作为Thread类的target.FutureTask有如下方法:
get():返回任务Callable的call方法的返回值,调用该方法导致程序阻塞,必须等到子线程程序结束以后才会得到返回值。
get(long timeout,
TimeUnit unit) 最多等待为使计算完成所给定的时间之后,获取其结果(如果结果可用)。超时会报异常。
以下示例创建一个线程,并且获得线程的返回值
package com.itcast.heima2;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class ThirdThread implements Callable<Integer>{
@Override
public Integer call() throws Exception {
int i=0;
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+" 的循环变量i的值:"+i);
}
return i;
}
public static void main(String[] args) {
ThirdThread thirdThread=new ThirdThread();
FutureTask<Integer>future=new FutureTask<Integer>(thirdThread);
for(int i=1;i<=40;i++){
System.out.println(Thread.currentThread().getName()+" 的循环变量i的值:"+i);
if(i==20){
new Thread(future).start();
}
}
try {
System.out.println(" BEGIN " );
System.out.println("子线程的返回值是:"+future.get());
System.out.println(" OVER ");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
由于在主线程里面用get()方法要获取子线程运行接口,主线程最后会阻塞,直到子线程call方法运行结束并返回为止。
相关文章推荐
- 使用Callable与Future来创建启动线程
- 创建线程的第三种方式Callable和Future CompletionService
- 线程第五课,线程创建之三,接口Callable_Future(了解即可)
- java核心知识点学习----创建线程的第三种方式Callable和Future CompletionService
- 04_线程的创建和启动_使用Callable和Future的方式
- 使用Callable和Future接口创建线程
- 线程创建2---Callable和Future
- java 多线程(一)---创建线程的三种方式Thread,Runnable,Callable与Future
- Java并发编程之线程创建和启动(Thread、Runnable、Callable和Future)
- Java线程(七):Callable和Future
- 线程--Callable和Future
- java线程:关于Callable和Future的简单使用:有返回值的线程
- Java线程中的Callable和Future
- Callable 和 Future实现线程等待
- Java中利用Future和callable接口监测异步线程的理解
- Java线程(六):Callable和Future
- 线程并发Callable 和 Future接口
- Callable,Runnable比较及用法以及创建线程的4种方法
- Java线程(六):Callable和Future
- 【Java线程】Callable和Future