线程以及java线程池实现分享
- 线程简介
- JDK线程池的工作原理
- JDK线程池的实现细节
1.线程简介-由来
1.进程
process_m.png****缺点****
1.性能,大量CPU与I/O操作
2.创建需要大量资源
2.线程模型
user_thread_1.png3.线程实现--用户线程
1.调度灵活,可定制高度算法
2.并不能完全解决阻塞问题
4.线程实现--内核线程
kernel_thread.png5.Java线程例子
1.PS
ps.png2.查看线程堆栈
jstack.png3.查看所有线程
pself.pngPOSIX标准
可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。
POSIX线程标准
Linux系统从2.6版本开始使用了一套实现了POSIX线程标准的库-NPTL(native posix thread library)
2. JDK线程池的工作原理
线程池的主要功能部件
- 队列(不同的队列实现)
- ThreadFactory
- 多个线程(主要参数:corePoolSize,maximumPoolSize,keepAliveTime)
工作流程
- 每个线程工作流程
- 整体工作流程
- 队列
queue.png直接提交
工作队列的默认选项是 SynchronousQueue,生产和消费,当无等待消费的worker时,生产一定失败。 newCachedThreadPool。
无界队列
使用无界队列(例如,不具有预定义容量的 LinkedBlockingQueue)将导致在所有 corePoolSize 线程都忙时新任务在队列中等待。这样,创建的线程就不会超过 corePoolSize。(因此,maximumPoolSize的值也就无效了。)当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列;newFixedThreadPool newSingleThreadExecutor。
有界队列
当使用有限的 maximumPoolSizes时,有界队列(如 ArrayBlockingQueue)有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。
网友评论