SlideShare a Scribd company logo
1
執行緒與並行API
學習目標
• 認識Thread與Runnable
• 使用synchronized
• 使用wait()、notify()、
notifyAll()
• 運用高階並行API
2
簡介執行緒
3
• 實作java.lang.Runnable介面
4
5
• 建構Thread實例來執行Runnable實例定義
的run()方法
6
Thread與Runnable
• 定義Runnable的run()方法
• Thread類別,並重新定義run()方法
7
8
• 實作Runnable較有彈性,因為類別還有機
會繼承其他類別
• 若繼承了Thread,那該類別就是一種
Thread
9
• 使用Lambda表示式
10
Daemon執行緒
• 主執行緒中啟動了其他執行緒,預設會等待
被啟動的執行緒都執行完
• 若有Thread被標示為Daemon執行緒,在非
Daemon執行緒都結束時,JVM就會終止
11
Thread基本狀態圖
12
• 運用多執行緒,當某執行緒進入Blocked時,
讓另一執行緒排入CPU執行(成為Running
狀態),避免CPU空閒下來,經常是改進效
能的方式之一
13
14
15
• 使用Thread.sleep()會讓執行緒進入
Blocked狀態
16
• join()表示將執行緒加入成為另一執行緒的
流程
• 可以在join()時指定時間
17
• 執行緒完成run()方法後,會進入Dead狀態
• 進入Dead(或已經呼叫過start()方法)的
執行緒不可呼叫start()方法,否則會拋出
IllegalThreadStateException
• Thread類別定義了stop()方法,不過被標
示為Deprecated
18
19
• 要停止執行緒,最好自行實作,讓執行緒跑
完應有的流程,而非呼叫Thread的stop()
• 執行緒的暫停、重啟,也必須視需求實作,
而不是直接呼叫suspend()、resume()等20
關於ThreadGroup
• 執行緒都屬於某執行緒群組
• 在main()主流程中產生執行緒,該執行緒會
屬於main執行緒群組
21
• 若沒有指定,會歸入產生該子執行緒的執行
緒群組
• 執行緒一旦歸入某群組,就無法更換群組
22
• ThreadGroup的某些方法,可以對群組中
的執行緒產生作用
• 若想一次取得群組中全部的執行緒,可以使
用enumerate()方法
• activeCount()方法可取得群組的執行緒
數量
23
• uncaughtException()方法,群組中某個
執行緒發生例外而未捕捉時,JVM會呼叫此
方法進行處理
24
• 對於執行緒本身未捕捉的例外,自行指定處
理方式
25
synchronized與volatile
• 若有兩個以上的執行緒
26
27
• 競速情況(Race condition)
• 執行緒安全(Thread-safe)
28
使用synchronized
• 若在方法標示synchronized,執行方法必
須取得該實例的內部鎖
29
30
• synchronized不只可宣告在方法上,也可
作為陳述句使用
31
• 對於本身設計時沒有考慮競速問題的API來說
32
• Collections的
synchronizedCollection()、
synchronizedList()、
synchronizedSet()、
synchronizedMap()等方法
33
34
35
• synchronized提供的是可重入同步(
Reentrant Synchronization)
• 不正確地使用synchronized可能造成效能
低落,另一問題則是死結(Dead lock)
– 你不放開resource1的內部鎖,我就不放開
resource2的內部鎖
36
37
38
使用volatile
• synchronized要求達到被標示區塊互斥性
(Mutual exclusion)與可見性(Visibility)
– 互斥性是指synchronized區塊只允許一個執行
緒
– 可見性是指執行緒離開synchronized區塊後,
另一執行緒接觸到的就是上一執行緒改變後的物
件狀態
• 對於可見性的要求,可以使用volatile達
到變數範圍
39
40
41
42
43
• 為了效率,執行緒可以快取變數的值
• 可以在變數上宣告volatile,表示變數是
不穩定、易變的
– 也就是可能在多執行緒下存取,這保證變數的可
見性
– 若有執行緒變動了變數值,另一執行緒必然能看
到變更
• 被標示為volatile的變數,不允許執行緒
快取,變數值存取必須在共享記憶體中進行
44
45
46
• 正確使用volatile的例子:
47
等待與通知
• wait()、notify()與notifyAll()
48
49
50
51
52
53
並行API
• 使用Thread建立多執行緒程式,必須親自處
理細節
• 如果需要的是執行緒池、讀寫鎖等高階操作
– java.util.concurrent套件
54
使用Lock
• ReentrantLock可以達到synchronized
的作用,也提供了額外功能
55
56
• Lock介面還定義了tryLock()方法
57
58
59
使用ReadWriteLock
• 定義了讀取鎖定與寫入鎖定行為
• readLock()、writeLock()方法
– ReentrantReadWriteLock.ReadLock沒有
任何寫入鎖定時,才可以取得讀取鎖定
– ReentrantReadWriteLock.WriteLock沒有
任何讀取或寫入鎖定時,才可以取得寫入鎖
60
61
62
使用StampedLock
• ReadWriteLock在沒有任何讀取或寫入鎖
定時,才可以取得寫入鎖定,這可用於實現
悲觀讀取(Pessimistic Reading)
– 飢餓(Starvation)問題
• StampedLock類別可支援樂觀讀取(
Optimistic Reading)
63
64
65
使用Condition
• 用來搭配Lock
66
67
• 使用了一個Condition,就有一個等待集
68
69
使用Executor
• 將Runnable的指定與執行分離
70
71
72
• 若定義一個ThreadPerTaskExecutor:
73
74
使用ThreadPoolExecutor
• 執行緒池這類服務的行為,定義在
Executor的子介面ExecutorService
• 根據不同的執行緒池需求,
ThreadPoolExecutor擁有數種不同建構
式可供使用
75
• 通常會使用Executors的
newCachedThreadPool()、
newFixedThreadPool()靜態方法來建構
76
• ExecutorService還定義了submit()、
invokeAll()、invokeAny()等方法
• 這些方法中出現了
java.util.concurrent.Future、
java.util.concurrent.Callable介面
77
• Future定義的行為,就是在未來取得結果
• 經常與Callable搭配使用
• FutureTask是Future的實作類別
78
79
• ExecutorService的submit()方法,它
可以接受Callable物件
• 呼叫後傳回Future物件
80
ScheduledThreadPoolExecutor
• 重複性的執行,可使用
scheduleWithFixedDelay()與
scheduleAtFixedRate()方法
81
使用ForkJoinPool
• 解決分而治之(Divide and conquer )的問題
82
83
• ForkJoinPool實現了工作竊取演算
• ForkJoin框架適用於計算密集式的任務
84
簡介並行Collection
85
• CopyOnWriteArrayList
• CopyOnWriteArraySet
• BlockingQueue
• ConcurrentMap
86
87
88
89

More Related Content

What's hot

Dependency Injection in iOS
Dependency Injection in iOSDependency Injection in iOS
Dependency Injection in iOS
Pablo Villar
 
Java annotations
Java annotationsJava annotations
Java annotations
FAROOK Samath
 
Introduction to Hibernate Framework
Introduction to Hibernate FrameworkIntroduction to Hibernate Framework
Introduction to Hibernate Framework
Mohit Kanwar
 
Spring introduction
Spring introductionSpring introduction
Spring introduction
Manav Prasad
 
Java threads
Java threadsJava threads
Java threads
Prabhakaran V M
 
Constructor in java
Constructor in javaConstructor in java
Constructor in java
Hitesh Kumar
 
CH1:Java平台概論
CH1:Java平台概論CH1:Java平台概論
CH1:Java平台概論
Justin Lin
 
The Single Responsibility Principle
The Single Responsibility PrincipleThe Single Responsibility Principle
The Single Responsibility Principle
Lars-Erik Kindblad
 
Building RESTful applications using Spring MVC
Building RESTful applications using Spring MVCBuilding RESTful applications using Spring MVC
Building RESTful applications using Spring MVC
IndicThreads
 
Java features
Java featuresJava features
Java features
myrajendra
 
Interfaces in java
Interfaces in javaInterfaces in java
Interfaces in java
Shiv Mehmi
 
Sqlite
SqliteSqlite
Sqlite
Kumar
 
Object oriented programming With C#
Object oriented programming With C#Object oriented programming With C#
Object oriented programming With C#
Youssef Mohammed Abohaty
 
Java features
Java featuresJava features
Java features
Prashant Gajendra
 
Final keyword in java
Final keyword in javaFinal keyword in java
Final keyword in java
Lovely Professional University
 
07 java variables
07   java variables07   java variables
07 java variables
Zeeshan-Shaikh
 
Introduction to Angular 2
Introduction to Angular 2Introduction to Angular 2
Introduction to Angular 2
Knoldus Inc.
 
Threads in JAVA
Threads in JAVAThreads in JAVA
Learning Git and GitHub - BIT GDSC.pdf
Learning Git and GitHub - BIT GDSC.pdfLearning Git and GitHub - BIT GDSC.pdf
Learning Git and GitHub - BIT GDSC.pdf
Jayprakash677449
 
Spring boot
Spring bootSpring boot
Spring boot
Gyanendra Yadav
 

What's hot (20)

Dependency Injection in iOS
Dependency Injection in iOSDependency Injection in iOS
Dependency Injection in iOS
 
Java annotations
Java annotationsJava annotations
Java annotations
 
Introduction to Hibernate Framework
Introduction to Hibernate FrameworkIntroduction to Hibernate Framework
Introduction to Hibernate Framework
 
Spring introduction
Spring introductionSpring introduction
Spring introduction
 
Java threads
Java threadsJava threads
Java threads
 
Constructor in java
Constructor in javaConstructor in java
Constructor in java
 
CH1:Java平台概論
CH1:Java平台概論CH1:Java平台概論
CH1:Java平台概論
 
The Single Responsibility Principle
The Single Responsibility PrincipleThe Single Responsibility Principle
The Single Responsibility Principle
 
Building RESTful applications using Spring MVC
Building RESTful applications using Spring MVCBuilding RESTful applications using Spring MVC
Building RESTful applications using Spring MVC
 
Java features
Java featuresJava features
Java features
 
Interfaces in java
Interfaces in javaInterfaces in java
Interfaces in java
 
Sqlite
SqliteSqlite
Sqlite
 
Object oriented programming With C#
Object oriented programming With C#Object oriented programming With C#
Object oriented programming With C#
 
Java features
Java featuresJava features
Java features
 
Final keyword in java
Final keyword in javaFinal keyword in java
Final keyword in java
 
07 java variables
07   java variables07   java variables
07 java variables
 
Introduction to Angular 2
Introduction to Angular 2Introduction to Angular 2
Introduction to Angular 2
 
Threads in JAVA
Threads in JAVAThreads in JAVA
Threads in JAVA
 
Learning Git and GitHub - BIT GDSC.pdf
Learning Git and GitHub - BIT GDSC.pdfLearning Git and GitHub - BIT GDSC.pdf
Learning Git and GitHub - BIT GDSC.pdf
 
Spring boot
Spring bootSpring boot
Spring boot
 

Similar to CH11:執行緒與並行API

Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
 
執行緒與並行API
執行緒與並行API執行緒與並行API
執行緒與並行API
Justin Lin
 
CH02:從JDK到IDE
CH02:從JDK到IDECH02:從JDK到IDE
CH02:從JDK到IDE
Justin Lin
 
Java_07:Thread
Java_07:ThreadJava_07:Thread
Java_07:Thread
Brad Chao
 
並行與平行
並行與平行並行與平行
並行與平行
Justin Lin
 
DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略
Will Huang
 
並行、平行與非同步
並行、平行與非同步並行、平行與非同步
並行、平行與非同步
Justin Lin
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
Justin Lin
 
流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式
Justin Lin
 
最新Java技术内存模型
最新Java技术内存模型最新Java技术内存模型
最新Java技术内存模型yiditushe
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
Justin Lin
 
Multithread
MultithreadMultithread
Multithread
Medivh2011
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
javatwo2011
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘Liu Allen
 
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用hugo
 
The Rails 4 Way Chapter 1
The Rails 4 Way Chapter 1The Rails 4 Way Chapter 1
The Rails 4 Way Chapter 1
Drake Huang
 
Ch02 撰寫與設定Servlet
Ch02 撰寫與設定ServletCh02 撰寫與設定Servlet
Ch02 撰寫與設定Servlet
Justin Lin
 
Java Tutorial:Learn Java in 06:00:00
Java Tutorial:Learn Java in 06:00:00Java Tutorial:Learn Java in 06:00:00
Java Tutorial:Learn Java in 06:00:00
Justin Lin
 

Similar to CH11:執行緒與並行API (19)

Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行APIJava SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
 
執行緒與並行API
執行緒與並行API執行緒與並行API
執行緒與並行API
 
CH02:從JDK到IDE
CH02:從JDK到IDECH02:從JDK到IDE
CH02:從JDK到IDE
 
Java_07:Thread
Java_07:ThreadJava_07:Thread
Java_07:Thread
 
並行與平行
並行與平行並行與平行
並行與平行
 
DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略DEV305 - ASP.NET 5 開發攻略
DEV305 - ASP.NET 5 開發攻略
 
並行、平行與非同步
並行、平行與非同步並行、平行與非同步
並行、平行與非同步
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
流程語法與函式
流程語法與函式流程語法與函式
流程語法與函式
 
最新Java技术内存模型
最新Java技术内存模型最新Java技术内存模型
最新Java技术内存模型
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
 
Multithread
MultithreadMultithread
Multithread
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
 
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
课题一:PHP5.3、PHP5.4的特性介绍与深度挖掘
 
lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用lua & ngx_lua 的介绍与应用
lua & ngx_lua 的介绍与应用
 
The Rails 4 Way Chapter 1
The Rails 4 Way Chapter 1The Rails 4 Way Chapter 1
The Rails 4 Way Chapter 1
 
Ch02 撰寫與設定Servlet
Ch02 撰寫與設定ServletCh02 撰寫與設定Servlet
Ch02 撰寫與設定Servlet
 
Java Tutorial:Learn Java in 06:00:00
Java Tutorial:Learn Java in 06:00:00Java Tutorial:Learn Java in 06:00:00
Java Tutorial:Learn Java in 06:00:00
 

More from Justin Lin

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
Justin Lin
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
Justin Lin
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
Justin Lin
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
Justin Lin
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
Justin Lin
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
Justin Lin
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
Justin Lin
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
Justin Lin
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
Justin Lin
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
Justin Lin
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
Justin Lin
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
Justin Lin
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
Justin Lin
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
Justin Lin
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
Justin Lin
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
Justin Lin
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
Justin Lin
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
Justin Lin
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
Justin Lin
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
Justin Lin
 

More from Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
10. 資料永續與交換
10. 資料永續與交換10. 資料永續與交換
10. 資料永續與交換
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
 

CH11:執行緒與並行API