首页 / JAVA / java并发之线程池
java并发之线程池
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java并发之线程池,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2234字,纯文字阅读大概需要4分钟。
内容图文
![java并发之线程池](/upload/InfoBanner/zyjiaocheng/851/179fcdc63def4697a594c0a84847a3bd.jpg)
在并发场景下,几乎所有的异步操作和任务执行都可以使用线程池,线程池具有如下优点
- 降低资源消耗
- 提高响应速度
提高线程的可管理性
实现原理
从图中可以看出,提交一个新任务到线程池的处理流程如下:- 判断线程池里的核心线程是否都在执行任务,如果不是则创建一个新的工作线程执行任务,如果是则进入下个流程(corepoolsize是否已满)
- 判断线程池的工作队列是否已满,如果工作队列没有满,则将新提交的任务存储进工作队列里,如果工作队列已经满了,进入下个流程
判断线程池的所有线程是否都在工作状态。如果没有,则创建新的工作线程执行任务,如果已经满了,交给饱和策略来处理这个任务(maxpoolsize是否已满)
Executor框架
java采用Executor将任务分解到不同的线程,然后操作系统内核将这些线程映射到处理器的两级调用框架。其中,Executor的核心接口是Executor和其子接口ExecutorService,两个核心实现类是ThreadPoolExecutor和ScheduledThreadPoolExecutor。
ThreadPoolExecutor的execute方法
public void execute(Runnable command) {
//传入继承Runable接口的任务,不能为null
if (command == null)
throw new NullPointerException();
int c = ctl.get();
//判断当前工作线程的数量是否小于核心线程数量
if (workerCountOf(c) < corePoolSize) {
//创建线程运行该任务,允许失败
if (addWorker(command, true))
return;
c = ctl.get();
}
//如果当前运行线程数大于核心线程数或创建失败,将任务添加到工作队列
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
//如果队列已满且不允许新建线程则执行饱和策略
else if (!addWorker(command, false))
reject(command);
}
2、线程池使用
线程池创建
ThreadPoolExecutor初始化
ThreadPoolExecutor(int corePoolSize,//核心线程数量
int maximumPoolSize,//最大线程数量
long keepAliveTime,//空闲线程存活时间
TimeUnit unit,//时间单位
BlockingQueue<Runnable> workQueue,//任务队列,保存等待任务的阻塞队列
ThreadFactory threadFactory,//创建线程的工厂类
RejectedExecutionHandler handler)//饱和策略
提交任务
ThreadPoolExecutor有两个方法可以提交任务execute()和submit()。其中submit()方法提交的任务可以返回一个future对象来接收返回值。
中止线程池
可以调用shutdown()或者shutdownnow()方法来关闭线程池,两个方法都是遍历所有线程然后调用interrupt方法来实现,不同之处在于shutdown将线程池设置为shutdown状态然后关闭所有没有正在执行的线程,shutdownnow方法将线程池置为stop状态然后关闭所有线程。
内容总结
以上是互联网集市为您收集整理的java并发之线程池全部内容,希望文章能够帮你解决java并发之线程池所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。