目錄
1.等待多執行緒完成的countdownlatch
2.同步屏障cyclicbarrier
3.控制併發執行緒數的semaphore
4.執行緒間交換資料的exchanger
countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作,類似於join方法。join的實現原理是不停的檢查join執行緒是否存活,如果join執行緒存活則讓當前執行緒永遠等待。countdownlatch經常用於監聽某些初始化操作,等初始化執行完畢後,通知主線程繼續工作。
countdownlatch的建構函式接收乙個int型別的引數作為計數器,如果你想等待n個點完成,這裡就傳入n。當呼叫countdownlatch的countdown方法時,n就會減1,countdownlatch的await方法會阻塞當前執行緒,直到n變成零。由於countdownlatch的countdown方法可以用在任何地方,所以這裡說的n個點,可以是n個執行緒,也可以是1個執行緒裡的n個執行步驟。當然,如果乙個執行緒執行很慢的話,我們不可能讓主線程一直等待下去,所以可以使用另外乙個帶有指定時間的await方法,await(long time,timeunit unit)這個方法等待特定時間後,就會不再阻塞當前執行緒。
實現的例項**如下:
public class countdownlatchtest catch (interruptedexception e)
system.out.println(1);
countdownlatch.countdown();
}}).start();
new thread(new runnable()
}).start();
countdownlatch.await();
system.out.println("thread finished");}}
cylicbarrier讓一組執行緒到達乙個屏障(同步點)時被阻塞,直到最後乙個執行緒到達屏障時,屏障才會開門,所有被屏障攔截的執行緒才會繼續執行。假設每個執行緒代表乙個跑步運動員,當運動員都準備好以後,才一起出發,只要有乙個人沒有準備好,大家都等待。cylicbarrier預設的構造方法是cylicbarrier(int parties),其引數表示屏障攔截的執行緒數量,每個執行緒呼叫await方法告訴cylicbarrier已經到達屏障,然後當前執行緒被阻塞。
例項**如下:
public class cyclicbarriertest catch (interruptedexception e) catch (brokenbarrierexception e)
system.out.println(1);
}}).start();
new thread(new runnable() catch (interruptedexception e) catch (brokenbarrierexception e)
}}).start();
system.out.println("thread finished");}}
如果把建構函式更改為3,則主線程和子執行緒永遠都不會得到執行,因為沒有第3個執行緒執行await方法,即沒有第3個執行緒到達屏障,所以之前到達屏障的兩個執行緒永遠不會繼續執行。
public class cyclicbarriertest implements runnable catch (interruptedexception e) catch (brokenbarrierexception e)
}});}}
public static void main(string args) throws interruptedexception
@override
public void run()
concurrentmap.put("result", result);}}
countdownlatch的計數器只能使用一次,而cyclicbarrier的計數器可以使用reset方法重置。所以cyclicbarrier可以處理更加複雜的業務場景。例如,如果計算發生錯誤,可以重置計數器,並讓執行緒重新執行一次。
semaphore(訊號量)是用來控制同時訪問特定資源的執行緒數量,它通過協調各個執行緒以保證合理的使用公共資源。semaphore可以用於做流量控制,特別是公共資源有限的應用場景,比如資料庫的連線。
例項**:
public class semaphoretest catch (interruptedexception e)
system.out.println("link data base");
semaphore.release();
}});}}
public static void main(string args)
}
雖然有20個執行緒在執行,但是只允許5個併發執行。semaphore的用法非常的簡答,首先執行緒使用semaphore的acquire()方法獲得乙個許可證,使用完之後呼叫release()方法歸還許可證,還可以使用tryacquire()方法嘗試獲取許可證。semaphore還提供了一些其他的方法:
exchanger是乙個用於執行緒間協作的工具類。exchanger用於進行執行緒間的資料交換。它提供乙個同步點,在這個同步點,兩個執行緒可以交換彼此的資料。這兩個執行緒通過exchanger()方法交換資料,如果乙個執行緒先執行exchanger()方法交換資料,它會一直等待第二個執行緒也執行exchanger方法,當兩個執行緒到達同步點的時候,兩個執行緒可以將本執行緒生產出來的資料傳遞給對方,交換資料。
public class exchangertest catch (interruptedexception e)
}});
executor.execute(new runnable() catch (interruptedexception e)
}});
}public static void main(string args)
}
如果兩個執行緒有乙個沒有執行exchange()方法,則會一直等待,為了避免一直等待,可以使用exchange(v x,long timeout,timeunit unit)設定最大等待時長。 java中的併發工具類
類名稱類的簡介 類的特點 countdownlatch 允許乙個或者多個執行緒等待其他執行緒完成之後再執行後續操作 countdownlatch提供了乙個計數器,只能初始化一次,但是提供了乙個await方法,允許設定乙個時間,當等待一段時間後,就會不再阻塞當前執行緒。cyclicbarrier 讓一...
Java併發工具類之CyclicBarrier
cyclicbarrier的意思是可迴圈使用的屏障。它可以讓一組執行緒到達乙個屏障時被阻塞,直到最後乙個執行緒到達屏障時,屏障才會開門,所有阻塞的執行緒才會繼續執行。它就好像一道關卡,只有所有的部隊 執行緒 都到了才能放行。部分原始碼 public class cyclicbarrier 可以看到,...
JAVA 併發程式設計 同步工具類
countdownlatch 閉鎖 閉鎖是一種同步工具類,可以延遲線程的進度知道其到達終止狀態。閉鎖的作用相當於一扇門 await 在閉鎖到達結束狀態之前,這扇門一直是關閉的,不允許任何執行緒通過,當到達結束狀態時 所有執行緒均到達countdown 這扇門會開啟並且允許所有的執行緒通過。而且,當門...