java核心技術筆記--執行緒
執行緒的中斷
執行緒中斷(終止)的兩種情況:
1. 執行到了run方法的最後一條語句後,並執行return返回時。
2. 由於出現了未捕獲的異常。
沒有可以強制中斷執行緒的方法,然而interrupt
可以請求終止執行緒。
呼叫interrupt
將執行緒的中斷狀態置位。
呼叫isInterrupt
判斷執行緒是否為中斷狀態。
如果執行緒被阻塞,那麼無法進行判斷,產生一個InterruptException
異常。
Thread.Interrupted ----> Thread.currentThread().isInterrupted(true)
檢測當前執行緒是否中斷。
預設的isInterrupted()----->isInterrupted(false)
。
執行緒的狀態
- new
- runnable
- blocked
- waiting
- timed waiting
- terminated
呼叫getState()
獲取執行緒的狀態。
執行緒屬性
- 優先順序:預設NORM_PRIORITY = 5,MIN_PRIORITY = 1,MAX_PRIORITY = 10;
- 守護執行緒:用途是為其他執行緒提供服務。 3.
鎖物件
Lock myLock = new ReentrantLock();
myLock.lock();
try{
....
}finally{
myLock.unlock();
}
不能使用帶資源的try語句。記得解鎖。
條件物件
Condition condition = new ReentrantLock().newCondition();
condition.await();
condition.signAll();
condition.sign();
sychronized
public synchronized void method(){...};
------------------------------------>
public void method(){
this.intrinsicLock.lock();
try{
...
}finally{
this.intrinsicLock.unlock();
}
}
synchronized
wait();
notifyAll();
notify();
監視器
監視器特性:
1. 監視器只包含私有域的類。
2. 每個監視器類的物件有一個相關的鎖。
3. 使用該鎖對所有方法進行加鎖。
4. 該鎖有任意多個相關條件。
java監視器:
1. 域不要求是private。
2. 方法不要求是synchronized。
3. 內部鎖對客戶是可用的。
4.
Volatile域
同步格言:如果向一個變數寫入值,而這個變數接下來可能被另一個執行緒讀取,或者,從一個變數讀值,而這個變數可能是之前被另一個執行緒寫的,此時必須使用同步。
volatile關鍵字為例項域的同步訪問提供了一種免鎖機制。
原子性
原子操作
AtomicInteger a = new AtomicInteger();
a.incrementAndGet();
鎖測試和超時
Boolean b = myLock.tryLock(100,TimeUnit.MILLISECONDS);
myCondition.await(100,TimeUnit.SECONDS);
讀/寫鎖
private ReentranReadWriteLock rwl = new ReentranReadWriteLock();
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock;
棄用stop和suspend的原因
試圖控制一個給定執行緒的行為。容易死鎖。
阻塞佇列
BlockingQueue
介面實現的方法:
方法 | 動作 | 特殊 |
---|---|---|
add | 新增一個元素 | 佇列滿拋異常IllegalStateException |
element | 返回佇列的頭元素 | 佇列空拋異常NoSuchElementException |
offer | 新增一個元素並返回true | 佇列滿返回false |
peek | 返回佇列的頭元素 | 空返回null |
poll | 移出並返回佇列頭元素 | 空返回null |
put | 新增一個元素 | 滿阻塞 |
remove | 移出並返回頭元素 | 空拋異常NoSuchElementException |
take | 移出並返回頭元素 | 空阻塞 |
DelayQueue
佇列實現Delay
介面
interface Delayed extends Comparable<Delayed>{
long getDelay(TimeUnit unit);
}
getDelay
方法返回物件的殘留延遲。負值表示延遲已經結束。元素只有在延遲用完的情況才能從DelayQueue
中移除。
TransferQueue
介面,允許生產者執行緒等待,直到消費者準備就緒可以接受一個元素。
Callable和Future
Callable
有返回值,是一個引數化型別的介面,只有一個方法call
public interface Callable<V>{
V call() throws Exception;
}
Future
儲存非同步計算的結果,直到計算完成。
public interface Future<V>{
V get() throws...;
V get(long timeout,TimeUnit unit) throws ...;
void cancel(boolean mayInterrupt);
boolean isCancelled();
boolean isDone();
}
執行器
Executor
類有許多靜態工廠方法用來構建執行緒池。
方法 | 描述 |
---|---|
newCachedThreadPool | 必要時建立新執行緒,空閒執行緒保留60秒 |
newFixedThreadPool | 該池包含固定數量的執行緒;空閒執行緒會一直保留 |
newSingleThreadExecutor | 只有一個執行緒的池,該執行緒順序執行每一個提交的任務 |
newScheduledThreadPool | 用於預定執行而構建的固定執行緒池 |
newSingleThreadScheduledExecutor | 用於預定執行而構建的單執行緒池 |
shutdownNow
:取消所有的任務
invokeAny
:提交所有物件到一個Callable物件的集合中,並返回某個已經完成了任務的結果。
invokeAll
:提交所有物件到一個Callable物件的集合中,並返回一個Future物件的列表,代表所有任務的解決方案。
同步器
類 | 作用 | 說明 |
---|---|---|
CyclicBarrier | 允許執行緒集等待直至其中預定數目的執行緒到達一個公共barrier,然後可以選擇執行一個處理barrier的動作 | 當大量的執行緒需要在他們的結果可用之前完成時 |
Phaser | 類似於迴圈barrier,不過有一個可變的計數 | |
CountDownLatch | 允許執行緒等待到計數器減為0 | 當一個或多個執行緒需要等待直到指定數目的事件發生 |
Exchanger | 允許兩個執行緒在要交換的物件準備好時交換物件 | 當兩個執行緒工作在同一個資料結構的兩個例項上的時候,一個向例項新增資料而另一個從例項清除資料 |
Semaphore | 允許執行緒集等待直到被允許繼續執行為止 | 限制訪問資源的執行緒總數。如果許可數為1,常常阻塞執行緒直到另一個執行緒給出許可為止 |
SynchronousQueue | 允許一個執行緒把物件交給另一個執行緒 | 在沒有顯式同步的情況下,當兩個執行緒準備好將一個物件從一個執行緒傳遞到另一個時 |
相關文章
- 《Java 多執行緒程式設計核心技術》筆記——第3章 執行緒間通訊(三)Java執行緒程式設計筆記
- 《Java 多執行緒程式設計核心技術》筆記——第3章 執行緒間通訊(四)Java執行緒程式設計筆記
- 多執行緒核心技術(1)-執行緒的基本方法執行緒
- Java核心技術學習筆記——進階——第五章 Java多執行緒和併發程式設計——5.2 Java多執行緒實現Java筆記執行緒程式設計
- Java多執行緒筆記Java執行緒筆記
- Java核心技術筆記 繼承Java筆記繼承
- java核心技術閱讀筆記Java筆記
- JAVA核心技術學習筆記--反射Java筆記反射
- Java 多執行緒學習筆記Java執行緒筆記
- java併發筆記之java執行緒模型Java筆記執行緒模型
- Java多執行緒學習筆記(自用)Java執行緒筆記
- Java核心技術學習筆記——進階——第五章 Java多執行緒和併發程式設計——5.5 Java併發框架ExecutorJava筆記執行緒程式設計框架
- 多執行緒筆記執行緒筆記
- Java執行緒池核心原理剖析Java執行緒
- Thinking in Java--Java多執行緒學習筆記(1)ThinkingJava執行緒筆記
- 核心執行緒執行緒
- Java核心技術筆記 異常、斷言和日誌Java筆記
- Dubbo學習筆記(三) RPC核心原理和執行緒模型筆記RPC執行緒模型
- Java併發技術05:傳統執行緒同步通訊技術Java執行緒
- iOS 多執行緒筆記iOS執行緒筆記
- 多執行緒筆記 一執行緒筆記
- 多執行緒筆記 三執行緒筆記
- 多執行緒筆記 二執行緒筆記
- JUC執行緒筆記(一)執行緒筆記
- Java多執行緒程式設計筆記9:ReentrantReadWriteLockJava執行緒程式設計筆記
- Thinking in Java---多執行緒學習筆記(2)ThinkingJava執行緒筆記
- Java核心技術 卷1 基礎知識 部分筆記Java筆記
- java執行緒的筆試題Java執行緒筆試
- 03-Java核心類庫_多執行緒Java執行緒
- 【併發技術01】傳統執行緒技術中建立執行緒的兩種方式執行緒
- Python筆記二之多執行緒Python筆記執行緒
- (三)Java併發學習筆記–執行緒封閉Java筆記執行緒
- 執行緒間協作-《thinking in java》讀書筆記(一)執行緒ThinkingJava筆記
- go語言多執行緒入門筆記-執行緒同步Go執行緒筆記
- 執行緒池之ScheduledThreadPoolExecutor執行緒池原始碼分析筆記執行緒thread原始碼筆記
- 執行緒池之ThreadPoolExecutor執行緒池原始碼分析筆記執行緒thread原始碼筆記
- 《Java核心技術》第五章 繼承 學習筆記Java繼承筆記
- Redis核心技術筆記07-08Redis筆記