Java併發工具類

2021-09-01 20:10:15 字數 3117 閱讀 6585

目錄

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 這扇門會開啟並且允許所有的執行緒通過。而且,當門...