File tree 1 file changed +80
-0
lines changed
1 file changed +80
-0
lines changed Original file line number Diff line number Diff line change
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使用率较高,但是可能遇到不可接受的调度开销,这样也会降低吞吐量。
You can’t perform that action at this time.
0 commit comments