Skip to content

Commit a37b76d

Browse files
committed
thread
1 parent 83e6998 commit a37b76d

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

_posts/2015-5-13-thread.md

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
##线程以及java线程池实现分享
2+
1. 线程简介
3+
2. JDK线程池的工作原理
4+
3. JDK线程池的实现细节
5+
6+
###1.线程简介-由来
7+
8+
***1.进程***
9+
10+
![process](http://www.codingdd.com/assets/images/2015-5-13-thread/process_m.png)
11+
****缺点****
12+
1.性能,大量CPU与I/O操作
13+
2.创建需要大量资源
14+
15+
***2.线程模型***
16+
17+
![process](http://www.codingdd.com/assets/images/2015-5-13-thread/user_thread_1.png)
18+
19+
***3.线程实现--用户线程***
20+
![process](http://www.codingdd.com/assets/images/2015-5-13-thread/user_thread_3.png)
21+
22+
1.调度灵活,可定制高度算法
23+
2.并不能完全解决阻塞问题
24+
25+
***4.线程实现--内核线程***
26+
![process](http://www.codingdd.com/assets/images/2015-5-13-thread/kernel_thread.png)
27+
28+
***5.Java线程例子***
29+
30+
1.PS
31+
32+
![process](http://www.codingdd.com/assets/images/2015-5-13-thread/ps.png)
33+
34+
2.查看线程堆栈
35+
36+
![process](http://www.codingdd.com/assets/images/2015-5-13-thread/jstack.png)
37+
38+
3.查看所有线程
39+
40+
![process](http://www.codingdd.com/assets/images/2015-5-13-thread/pself.png)
41+
42+
***POSIX标准***
43+
> 可移植操作系统接口(英语:Portable Operating System Interface,缩写为POSIX),是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE Std 1003,而国际标准名称为ISO/IEC 9945。此标准源于一个大约开始于1985年的项目。POSIX这个名称是由理查德·斯托曼应IEEE的要求而提议的一个易于记忆的名称。它基本上是Portable Operating System Interface(可移植操作系统接口)的缩写,而X则表明其对Unix API的传承。
44+
45+
***POSIX线程标准***
46+
Linux系统从2.6版本开始使用了一套实现了POSIX线程标准的库-NPTL(native posix thread library)
47+
48+
### 2. JDK线程池的工作原理
49+
50+
51+
***线程池的主要功能部件***
52+
53+
1. 队列(不同的队列实现)
54+
2. ThreadFactory
55+
3. 多个线程(主要参数:corePoolSize,maximumPoolSize,keepAliveTime)
56+
57+
58+
![](http://www.codingdd.com/assets/images/2015-5-13-thread/threadpool.png)
59+
60+
***工作流程***
61+
62+
1. 每个线程工作流程
63+
64+
![](http://www.codingdd.com/assets/images/2015-5-13-thread/work.png)
65+
66+
2. 整体工作流程
67+
68+
![](http://www.codingdd.com/assets/images/2015-5-13-thread/poolwork.png)
69+
70+
3. 队列
71+
72+
>**直接提交**
73+
>工作队列的默认选项是 SynchronousQueue,生产和消费,当无等待消费的worker时,生产一定失败。 newCachedThreadPool。
74+
75+
![](http://www.codingdd.com/assets/images/2015-5-13-thread/queue.png)
76+
77+
>**无界队列**
78+
>使用无界队列(例如,不具有预定义容量的 LinkedBlockingQueue)将导致在所有 corePoolSize 线程都忙时新任务在队列中等待。这样,创建的线程就不会超过 corePoolSize。(因此,maximumPoolSize的值也就无效了。)当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列;newFixedThreadPool newSingleThreadExecutor。
79+
>**有界队列**
80+
>当使用有限的 maximumPoolSizes时,有界队列(如 ArrayBlockingQueue)有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷:使用大型队列和小型池可以最大限度地降低 CPU 使用率、操作系统资源和上下文切换开销,但是可能导致人工降低吞吐量。如果任务频繁阻塞(例如,如果它们是 I/O边界),则系统可能为超过您许可的更多线程安排时间。使用小型队列通常要求较大的池大小,CPU使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。

0 commit comments

Comments
 (0)