java核心技術筆記--執行緒

sayWhat_sayHello發表於2018-07-10

執行緒的中斷

執行緒中斷(終止)的兩種情況:
1. 執行到了run方法的最後一條語句後,並執行return返回時。
2. 由於出現了未捕獲的異常。

沒有可以強制中斷執行緒的方法,然而interrupt可以請求終止執行緒。

呼叫interrupt將執行緒的中斷狀態置位。

呼叫isInterrupt判斷執行緒是否為中斷狀態。

如果執行緒被阻塞,那麼無法進行判斷,產生一個InterruptException異常。

Thread.Interrupted ----> Thread.currentThread().isInterrupted(true)檢測當前執行緒是否中斷。
預設的isInterrupted()----->isInterrupted(false)

執行緒的狀態

  1. new
  2. runnable
  3. blocked
  4. waiting
  5. timed waiting
  6. terminated

呼叫getState()獲取執行緒的狀態。

執行緒屬性

  1. 優先順序:預設NORM_PRIORITY = 5,MIN_PRIORITY = 1,MAX_PRIORITY = 10;
  2. 守護執行緒:用途是為其他執行緒提供服務。
  3. 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 允許一個執行緒把物件交給另一個執行緒 在沒有顯式同步的情況下,當兩個執行緒準備好將一個物件從一個執行緒傳遞到另一個時

相關文章