countdownlatch 閉鎖
閉鎖是一種同步工具類,可以延遲線程的進度知道其到達終止狀態。閉鎖的作用相當於一扇門(await):在閉鎖到達結束狀態之前,這扇門一直是關閉的,不允許任何執行緒通過,當到達結束狀態時(所有執行緒均到達countdown),這扇門會開啟並且允許所有的執行緒通過。而且,當門開啟了,就永遠保持開啟狀態。
作用:1、確保某些活動直到其他活動都完成後才繼續執行。
2、確保某個服務在其依賴的所有其他服務都已經啟動之後才啟動。
3、等待直到某個操作的所有參與者都就緒再繼續執行。
public class countdownlatchtest catch (interruptedexception e)
system.out.println("start lauch!!");
} public static class father implements runnable
@override
public void run()
} public static class mother implements runnable
@override
public void run()
} public static class grandmaandlizzy implements runnable
@override
public void run()
}}
futuretask
futuretask 實現了future介面,表示一種抽象的可生成結果(可撤銷、超時get)的計算。
futurtask 表示的計算是通過callable 來實現的,相當於一種可生成結果的runnable,可以處於以下三種狀態:等外執行、正在執行和執行完成。「執行完成」表示計算的所有可能結束方式,包括正常結束、由於取消而結束和由於異常而結束等。當futuretask進入完成狀態後,它會永遠停止在這個狀態上。
futuretask.get()的行為取決於任務的狀態,如果任務已經完成,那麼get會立即返回結果,否則get將阻塞知道任務進入完成狀態,然後返回結果或者丟擲異常。futuretask將計算結果從執行計算的執行緒傳遞到獲取這個結果的執行緒,而且futuretask的規範確保了這種傳遞過程能實現結果的安全發布。
futurtask在executor框架中表示非同步任務。
public class myfuturetaskdemo
});try catch (interruptedexception e) catch (executionexception e)
}}
semaphore 訊號量
可以用來控制同時訪問某個特定資源的運算元量,或者同時執行某個指定操作的數量。計數訊號量還可以用來實現某種資源池,或者對容器施加邊界。
acquire從此訊號量獲取乙個許可,在提供乙個許可前一直將執行緒阻塞,否則執行緒被中斷。獲取乙個許可(如果提供了乙個)並立即返回,將可用的許可數減 1。
release釋放乙個許可,將其返回給訊號量。釋放乙個許可,將可用的許可數增加 1。如果任意執行緒試圖獲取許可,則選中乙個執行緒並將剛剛釋放的許可給予它。然後針對執行緒安排目的啟用(或再啟用)該執行緒。
public class mysemaphoredemo
// 申請資源
public void getresource() throws interruptedexception
// 釋放資源
public void releaseresource()
public static void main(string args) catch (interruptedexception e)
}}).start();
} }}
cyclicbarrier 柵欄
cyclicbarrier 是乙個同步輔助類,它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待,此時 cyclicbarrier 很有用。因為該 barrier 在釋放等待執行緒後可以重用,所以稱它為迴圈 的 barrier。
cyclicbarrier 支援乙個可選的 runnable 命令,在一組執行緒中的最後乙個執行緒到達之後(但在釋放所有執行緒之前),該命令只在每個屏障點執行一次。若在繼續所有參與執行緒之前更新共享狀態,此屏障操作 很有用。
cyclicbarrier 類似於閉鎖,它能阻塞一組執行緒直到某個事件發生。柵欄與閉鎖的關鍵區別在於,所有執行緒必須同時到達柵字段置,才能繼續執行。閉鎖用於等待事件,而柵欄用於等待其他先。
public class mybarrierdemo
});new thread(new father(barrier)).start();
new thread(new mother(barrier)).start();
new thread(new grandmaandlizzy(barrier)).start();
} public static class father implements runnable
@override
public void run() catch (interruptedexception e) catch (brokenbarrierexception e)
system.out.println("every arrive ,start lauch!!");
} }public static class mother implements runnable
@override
public void run() catch (interruptedexception e) catch (brokenbarrierexception e)
system.out.println("every arrive ,start lauch!!");
} }public static class grandmaandlizzy implements runnable
@override
public void run() catch (interruptedexception e) catch (brokenbarrierexception e)
system.out.println("every arrive ,start lauch!!");
} }}
exchanger 雙邊柵欄
exchanger 是一種兩方柵欄:各方柵欄在阻塞位置上交換資料(雙方都達到阻塞位置時)。當兩方執行不對稱的操作時,會非常有用。當兩個執行緒通過exchanger交換物件時,這種交換就把這兩個物件安全的發布給另一方。
public class exchangetest
static class producer extends thread
@override
public void run() else
try catch (interruptedexception e)
if (list.size() == 5) else
system.out
.println("***************===producer********************==");
}} }
static class consumer extends thread
public void run() else
try catch (interruptedexception e)
if (list.size() == 5) else
system.out
.println("***************===consumer********************==");
}} }
}
java併發程式設計 Exexctors 工具類
executors 類提供了一系列靜態工廠方法用於建立各種執行緒池。創建固定大小的執行緒池。每次提交乙個任務就建立乙個執行緒,直到執行緒達到執行緒池的最大大小。執行緒池的大小一旦達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充乙個新執行緒。如果執行緒池中的所有執行緒都處於...
JDK同步控制工具,JAVA高併發程式設計
同步控制是併發程式的重要手段之一,我們平常用過最多的synchronized就是其中一種簡單的方法,此外還有object.wait object.notify 等方法。在jdk之中,還有其他好用的工具。乙個可重入的互斥鎖lock,它具有與使用synchronized方法和語句所訪問的隱式監視器鎖相同...
Java併發工具類
目錄 1.等待多執行緒完成的countdownlatch 2.同步屏障cyclicbarrier 3.控制併發執行緒數的semaphore 4.執行緒間交換資料的exchanger countdownlatch允許乙個或多個執行緒等待其他執行緒完成操作,類似於join方法。join的實現原理是不停的...