Future、Callable配套使用
Runnable与Callable区别:
- Runnable接口:
一个独立的任务,任务执行的结果,无需告知主线程
Runnable接口中的方法为:void run(){}
- Callable接口:
也是一个独立的任务,但是任务执行的结果,是主线程想要知晓的,因此可以配套Future接口,在将来的某个时间点,主线程可以获取到独立任务的执行结果,以便主线程拿来消费使用这个任务的执行成果
Callable接口中的方法为:T call(){}
示例代码:
/**
* 演示Future、Callable用法
*/
import java.util.concurrent.*;
import java.util.concurrent.locks.*;
import java.util.concurrent.atomic.*;
public class FutureTest{
public static void main(String[] args){
ExecutorService es = Executors.newFixedThreadPool(2);
Future<Integer> f1 = es.submit(new MyTask());
try{
System.out.println("主线程痴痴的等子线程的运算结果!");
Integer sum = f1.get();
System.out.println("sum is :"+sum);
}catch(Exception ee){}
es.shutdown();
System.out.println("main is over....");
}
}
class MyTask implements Callable<Integer>
{
public Integer call(){
int sum = 0;
for(int i=0;i<5000;i++){
sum+=i;
}
try{
Thread.sleep(2000);
System.out.println("子线程运算完毕!");
}catch(Exception ee){}
return sum;
}
}
程序运行结果如下:
主线程痴痴的等子线程的运算结果!
子线程运算完毕!
sum is :12497500
main is over....