今天就跟大家聊聊有关Java项目中的线程池异步怎么利用 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 class Testasync {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
if(task0() == true){
System.out.println("执行完毕,看异步结果");
}
}
public static void task1(){
System.out.println("task1 is start");
}
public static void task2(){
ExecutorService executor = Executors.newFixedThreadPool(1);
executor.submit(new Callable(){
@Override
public Object 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 void task3(){
System.out.println("task3 is start");
int j = 0;
while(true) {
if(j++ > 10) {
break;
}
System.out.println("------------task3 end-----------");
}
}
public static boolean task0(){
task1();
task2();
task3();
return true;
}
}
然后看结果:
task1 is start
task3 is start
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
task2执行数据的大量导入或者导出
执行完毕,看异步结果
task2=49995000
task2导入或者导出完成
可以看出,task1 和task3先执行了,并且方法在没有等待task2的情况下,直接结束了。
异步的task2另开了一个线程,自己在执行。和主线程已经无关了。
不过,这种在eclipse中以deubug模式是看不出来的。
看完上述内容,你们对Java项目中的线程池异步怎么利用 ExecutorServic实现有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。