博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Java并发编程实战》第八章 线程池的使用 读书笔记
阅读量:4585 次
发布时间:2019-06-09

本文共 1697 字,大约阅读时间需要 5 分钟。

一、在任务与运行策略之间的隐性解耦

有些类型的任务须要明白地指定运行策略,包含:
. 依赖性任务。依赖关系对运行策略造成约束,须要注意活跃性问题。要求线程池足够大,确保任务都能放入。
. 使用线程封闭机制的任务。须要串行运行。
. 对响应时间敏感的任务。
. 使用ThreadLocal的任务。
1. 线程饥饿死锁
线程池中假设全部正在运行任务的线程都因为等待其它仍处于工作队列中的任务而堵塞,这样的现象称为线程饥饿死锁。
2. 执行时间较长的任务
Java提供了限时版本号与无限时版本号。比如Thread.join、BlockingQueue.put、CutDownLatch.await、Selector.select

二、设置线程池的大小

要正确地设置线程池的大小,你必须估算出任务的等待时间与计算时间的比值。这样的估算不须要非常精确,而且能够通过一些分析或监控工具来获得。

公式定义:
int N_CPUS = Runtime.getRuntime().availableProcessors();
CPU并非唯一影响线程池大小的资源。还包含内存、文件句柄、套接字句柄和数据库连接等。

计算每一个任务对该资源的需求量。然后用该资源的可用总量除以每一个任务的需求量,所得结果就是线程池大小的上限。

三、配置ThreadPoolExecutor

API文档中对构造函数的描写叙述:
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          RejectedExecutionHandler handler)
用给定的初始參数和默认的线程工厂创建新的 ThreadPoolExecutor。
1. 线程池的创建与销毁
能够查看Executors几个方法源代码来辅助理解ThreadPoolExecutor參数的配置。

2. 管理队列任务
ThreadPoolExecutor同意提供一个BlockingQueue来保存等待运行的任务。

主要的任务排队方法有3种:无界队列、有界队列、同步移交。

java.util.concurrent.BlockingQueue 全部已知实现类: 
ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue

 
3. 饱和策略
有界队列已经填满或者向关闭的Executor提交任务时须要考虑饱和策略。
ThreadPoolExecutor.setRejectedExecutionHandler
public void setRejectedExecutionHandler(RejectedExecutionHandler handler)设置用于未运行任务的新处理程序。

 

java.util.concurrent.RejectedExecutionHandler 全部已知实现类: 
ThreadPoolExecutor.AbortPolicy, ThreadPoolExecutor.CallerRunsPolicy, ThreadPoolExecutor.DiscardOldestPolicy, ThreadPoolExecutor.DiscardPolicy 

AbortPolicy是默认饱和策略
-- 待填充
4. 工厂方法
5. 在调用构造函数后再定制ThreadPoolExecutor
在创建线程池后。依旧能够通过ThreadPoolExecutor提供的方法改动构造时传入的參数。

四、扩展ThreadPoolExecutor
五、递归算法的并行化

临时用不到

转载于:https://www.cnblogs.com/ycfenxi/p/6718247.html

你可能感兴趣的文章
CSS3画腾讯QQ图标 无图片和js参考
查看>>
C#使用Emit生成构造函数和属性
查看>>
python pip源配置,pip配置文件存放位置
查看>>
[数据库]关于MAX()函数的一个坑
查看>>
实现前后滚动效果-axure设计实例
查看>>
windows下mysql忘记root密码--吐血测试,都是泪
查看>>
lnmp集成开发环境安装pdo_dblib扩展
查看>>
linux web.py spawn-fcgi web.py 配置
查看>>
lintcode : 空格替换
查看>>
lintcode 中等题:subsets II 带重复元素的子集
查看>>
【原创】Linux基础之测试域名IP端口连通性
查看>>
webstorm快捷键大全
查看>>
SQL Server 语法大全
查看>>
MySQL存储过程
查看>>
HttpContext是干什么的
查看>>
线程安全
查看>>
原形模式
查看>>
iOS开发笔记5:多线程之NSThread、NSOperation及GCD
查看>>
php中curl的详细解说【转】
查看>>
Codeforces Round #281 (Div. 2) C. Vasya and Basketball 二分
查看>>