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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。