详解JDK中ExecutorService与Callable和Future对线程的支持
详解JDK中ExecutorService与Callable和Future对线程的支持
1、代码背景:
假如有Thread1、Thread2、Thread3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?
2、代码:
统计“盘子”大小的代码,此处实现jdk中的Callable接口,
packagecom.wang.test.concurrent; importjava.util.concurrent.Callable; publicclassTask1implementsCallable{ privateintx; privateinty; publicTask1(intx,inty){ this.x=x; this.y=y; } @Override publicIntegercall()throwsException{ returnx*y; } }
统计汇总的代码,也是实现jdk中的Callable接口,
packagecom.wang.test.concurrent; importjava.util.concurrent.Callable; publicclassTask2implementsCallable{ privateintx; privateinty; privateintq; privateintw; publicTask2(intx,inty,intq,intw){ this.x=x; this.y=y; this.q=q; this.w=w; } @Override publicIntegercall()throwsException{ returnx+y+q+w; } }
客户端:使用JDK中Executors.newFixedThreadPool方法创建ExecutorService,ExecutorService的submit方法接收Callable接口的实现,JDK内部将弄成线程处理,使用Future接收submit方法的返回值,当future调用get方法时,如果线程还没有执行完,程序阻塞在这里,知道线程执行完。
packagecom.wang.test.concurrent;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
importjava.util.concurrent.Future;
publicclassClient{
publicstaticvoidmain(String[]args)throwsException{
ExecutorServicepool=Executors.newFixedThreadPool(4);
Task1t1=newTask1(1,2);
Task1t2=newTask1(23,34);
Task1t3=newTask1(23,456);
Task1t4=newTask1(3,33);
Futuref1=pool.submit(t1);
Futuref2=pool.submit(t2);
Futuref3=pool.submit(t3);
Futuref4=pool.submit(t4);
//Future调用get方法时,如果线程还没有执行完,程序阻塞在这里
Task2t5=newTask2(f1.get(),f2.get(),f3.get(),f4.get());
Futuref5=pool.submit(t5);
System.out.println(f5.get());
pool.shutdown();
}
}
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!