详解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); Future f2=pool.submit(t2); Future f3=pool.submit(t3); Future f4=pool.submit(t4); //Future调用get方法时,如果线程还没有执行完,程序阻塞在这里 Task2t5=newTask2(f1.get(),f2.get(),f3.get(),f4.get()); Future f5=pool.submit(t5); System.out.println(f5.get()); pool.shutdown(); } }
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!