java executor 异步_Java ExecutorServic线程池(异步)

相信大家都在项目中遇到过这样的情况,前台需要快速的显示,后台还需要做一个很大的逻辑。比如:前台点击数据导入按钮,按钮后的服务端执行逻辑A,和逻辑B(执行大量的表数据之间的copy功能),而这时前台不能一直等着,要返回给前台,告诉正在处理中就行了。这里就需要用到异步了。

点击按钮 -> 逻辑A ->逻辑B(异步) -> 方法结束。

到底,项目需求明确了,就引入了ExecutorServic线程池。

Java通过Executors提供四种线程池,分别为:

newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;/**

* @author szy

* @version 创建时间:2018-5-20 上午10:25:06

**/

public classTestasync {/**

* @param args*/

public static voidmain(String[] args) {//TODO Auto-generated method stub

if(task0() == true){

System.out.println("执行完毕,看异步结果");

}

}public static voidtask1(){

System.out.println("task1 is start");

}public static voidtask2(){

ExecutorService executor= Executors.newFixedThreadPool(1);

executor.submit(newCallable(){

@OverridepublicObject call() throws Exception {//TODO Auto-generated method stub//增加睡眠时间,便于查看结果

/*try {

Thread.sleep(10000);

} catch (InterruptedException e) {

e.printStackTrace();

}*/

//异步提交

int sum = 0;for (int i = 0; i < 10000; i++) {

sum+=i;

}

System.out.println("task2执行数据的大量导入或者导出");

System.out.println("task2="+sum);

System.out.println("task2导入或者导出完成");return null;

}

});

}public static voidtask3(){

System.out.println("task3 is start");int j = 0;while(true) {if(j++ > 10) {break;

}

System.out.println("------------task3 end-----------");

}

}public staticboolean task0(){

task1();

task2();

task3();return true;

}

}

然后看结果:

task1 isstart

task3isstart------------task3 end-----------

------------task3 end-----------

------------task3 end-----------

------------task3 end-----------

------------task3 end-----------

------------task3 end-----------

------------task3 end-----------

------------task3 end-----------

------------task3 end-----------

------------task3 end-----------

------------task3 end-----------task2执行数据的大量导入或者导出

执行完毕,看异步结果

task2=49995000task2导入或者导出完成

可以看出,task1 和task3先执行了,并且方法在没有等待task2的情况下,直接结束了。

异步的task2另开了一个线程,自己在执行。和主线程已经无关了。

不过,这种在eclipse中以deubug模式是看不出来的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值