Java并发:搞定线程池(中)
向线程池提交任务
1.1 execute()
用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功。输入的是一个Runnable实例。
public void execute(Runnable command) { e.execute(command); }
如果没有特殊要求,使用缓存线程池是最合适的;
如果只能运行一个线程,就使用单线程池;
如果运行调度任务,则按需使用调度线程池或单线程池;
如果没有其他特殊要求,可以直接使用ThreadPoolExecutor类的构造函数来创建线程池,并自己给定7个参数。
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(3);
List<Future<String>> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
//任务放到阻塞队列
executorService.execute(new Runnable() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName());
}
});
}
1.2 submit()
用于提交需要返回值的任务,线程池会返回一个Future类型对象,通过此对象可以判断任务是否执行成功,并可通过get()获取返回值,get()会阻塞当前线程知道任务完成,而使用get(long,unit)方法则会阻塞一段时间后立即返回,可能任务没有执行完。
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(3);
List<Future<String>> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
//任务放到阻塞队列
Future<String> f = executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
TimeUnit.SECONDS.sleep(2);
return Thread.currentThread().getName();
}
});
list.add(f);
}
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).get()+"--------------"+i+"-------------------------");
}
}
关闭线程池
通过调用线程池的shutdown或shutdownNow方法来关闭线程池。
他们两个原理是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来终端线程,所以无法响应终端的任务可能永远无法终止。
shutdownNow:首先将线程池的状态设置成stop,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行的任务的列表。
shutdown:只是将线程池的状态设置成shutdown状态,然后中段所有没有正在执行任务的线程。
只要调用者两个关闭方法中的任意一个,isShutdown方法就会返回true,当所有的任务关闭后,才表示线程池瓜女子成功,这是调用isTerminaed方法会返回true。
通常shutdown方法来关闭线程池,若任务不一定执行完,则可以调用shutdownNow方法。
使用有界队列,可以增加系统的稳定性和预警能力。
线程池的状态
1. 当线程池创建后,初始为running状态
2. 调用shutdown方法后,处于shutdown状态,此事不再接受新的任务,等待已有的任务执行完毕
3. 执行shutdownNow方法后,进入stop状态,不在接受新的任务,并且尝试终止正在执行的任务
4. 当处于shutdown或stop状态,并且所有的工作线程已经销毁,任务缓存队列已经清空,线程池被设为terminated状态。
* Possible state transitions:
* NEW -> COMPLETING -> NORMAL
* NEW -> COMPLETING -> EXCEPTIONAL
* NEW -> CANCELLED
* NEW -> INTERRUPTING -> INTERRUPTED private static final int NEW = 0;
private static final int COMPLETING = 1;
private static final int NORMAL = 2;
private static final int EXCEPTIONAL = 3;
private static final int CANCELLED = 4;
private static final int INTERRUPTING = 5;
private static final int INTERRUPTED = 6;
Java并发:搞定线程池(中)的更多相关文章
- Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发编程:线程池的使用(转)
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- (转)Java并发编程:线程池的使用
背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...
- Java并发编程:线程池的使用(转载)
转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- Java并发编程:线程池的使用(转载)
文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...
- [转]Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- 【转】Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- 13、Java并发编程:线程池的使用
Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...
- Java并发:搞定线程池(上)
原文地址:https://www.nowcoder.com/discuss/152050?type=0&order=0&pos=6&page=0 本文是在原文的基础+理解,想要 ...
随机推荐
- Node.js实战6:定时器,使用timer延迟执行。
setTimeout 在nodejs中,通过setTimeout函数可以达到延迟执行的效果,这个函数也常被称为定时器. 一个简单的例子: console.log( (new Date()).getSe ...
- java注解编程@since 1.8
一.基本元注解: @Retention: 说明这个注解的生命周期 RetentionPolicy.SOURCE -> 保留在原码阶段,编译时忽略 RetentionPolicy.CLASS -& ...
- Unable to load dynamic library 'zip.so' on Centos 6.8 useing php7.3
背景: Centos6.8服务器升级php版本,从7.1升级到7.3,常用扩展都安装完成之后,报:Class 'ZipArchive' not found.一看就是zip扩展没有,需要手动安装了. 中 ...
- java_第一年_JavaWeb(2)
HTTP协议 HTTP协议——超文本传输协议,用于定义web浏览器和web服务器之间数据交换的过程,遵守一定的通讯的格式: HTTP请求——包括请求行和多个信息头 请求行:包含请求方式(常用的GET. ...
- SQL server2000 创建表单的方法(已实践检验)
我的系统是win7旗舰版的,在安装完SQL server2000之后,单击表,右键-新建表时,系统要么弹出:MMC检测到此管理单元发生一个错误.要么直接弹出microsoft sql server 2 ...
- 关于微信小程序的一些总结
mpvue? {{}} 在vue和小程序中的区别? 01 小程序中{{}}和vue中的{{}}用法基本一致,可以显示data中的数据,可以写表达式 不一样的地方? 01 小程序的{{}}可以写在属性中 ...
- activiti 5.22 表结构解析及清空流程运行测试数据
1.结构设计 1.1. 逻辑结构设计 Activiti使用到的表都是ACT_开头的. ACT_RE_*: 'RE'表示repository(存储),RepositoryService接口所操作的 ...
- linux性能分析工具Top
- day04 列表增删改查、元祖以及range
01 课前小甜点 千万不要随意做决定 只要你做了决定,你要坚持下去. 02 昨日内容回顾 int <---> bool : 非0 True 0 False True 1 False 0 i ...
- 6层PCB设计技巧和步骤
6层PCB设计技巧和步骤 一.原理图的编辑 6层板由于PCB板中可以有两层地,所以可以将模拟地和数字地分开.对于统一地还是分开地,涉及到电磁干扰中信号的最小回流路径问题,绘制完原理图,别忘检查错误和 ...