Java ExecutorServic线程池异步实现流程
相信大家都在项目中遇到过这样的情况,前台需要快速的显示,后台还需要做一个很大的逻辑。比如:前台点击数据导入按钮,按钮后的服务端执行逻辑A,和逻辑B(执行大量的表数据之间的copy功能),而这时前台不能一直等着,要返回给前台,告诉正在处理中就行了。这里就需要用到异步了。
点击按钮->逻辑A->逻辑B(异步)->方法结束。
到底,项目需求明确了,就引入了ExecutorServic线程池。
Java通过Executors提供四种线程池,分别为:
- newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
- newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
- newScheduledThreadPool创建一个定长线程池,支持定时及周期性任务执行。
- newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO,LIFO,优先级)执行。
importjava.util.concurrent.Callable; importjava.util.concurrent.ExecutorService; importjava.util.concurrent.Executors; /** *@authorszy *@version创建时间:2018-5-20上午10:25:06 * */ publicclassTestasync{ /** *@paramargs */ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub if(task0()==true){ System.out.println("执行完毕,看异步结果"); } } publicstaticvoidtask1(){ System.out.println("task1isstart"); } publicstaticvoidtask2(){ ExecutorServiceexecutor=Executors.newFixedThreadPool(1); executor.submit(newCallable(){ @Override publicObjectcall()throwsException{ //TODOAuto-generatedmethodstub //增加睡眠时间,便于查看结果 /*try{ Thread.sleep(10000); }catch(InterruptedExceptione){ e.printStackTrace(); }*/ //异步提交 intsum=0; for(inti=0;i<10000;i++){ sum+=i; } System.out.println("task2执行数据的大量导入或者导出"); System.out.println("task2="+sum); System.out.println("task2导入或者导出完成"); returnnull; } }); } publicstaticvoidtask3(){ System.out.println("task3isstart"); intj=0; while(true){ if(j++>10){ break; } System.out.println("------------task3end-----------"); } } publicstaticbooleantask0(){ task1(); task2(); task3(); returntrue; } }
然后看结果:
task1isstart task3isstart ------------task3end----------- ------------task3end----------- ------------task3end----------- ------------task3end----------- ------------task3end----------- ------------task3end----------- ------------task3end----------- ------------task3end----------- ------------task3end----------- ------------task3end----------- ------------task3end----------- task2执行数据的大量导入或者导出 执行完毕,看异步结果 task2=49995000 task2导入或者导出完成
可以看出,task1和task3先执行了,并且方法在没有等待task2的情况下,直接结束了。
异步的task2另开了一个线程,自己在执行。和主线程已经无关了。
不过,这种在eclipse中以deubug模式是看不出来的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。