java中常用的并发工具类
· 1. 等待多線程完成的CountDownLatch
構(gòu)造函數(shù)接收一個(gè)int類型的參數(shù)作為計(jì)數(shù)器,如果想等待N個(gè)點(diǎn),就傳入N。當(dāng)調(diào)用CountDownLatch的countDown方法時(shí),N就會減一,直至減為零。使用await方法等待,當(dāng)N的值變?yōu)榱?#xff0c;執(zhí)行await的線程繼續(xù)執(zhí)行。
public class CountDownTest {static CountDownLatch c = new CountDownLatch(2);static ExecutorService pool = Executors.newFixedThreadPool(2);public static void main(String agrs[]){pool.execute(new Runnable() {public void run() {try {TimeUnit.MILLISECONDS.sleep(3);}catch (InterruptedException e){e.printStackTrace();}System.out.println("This is A");c.countDown();}});pool.execute(new Runnable() {public void run() {try {TimeUnit.MILLISECONDS.sleep(3);}catch (InterruptedException e){e.printStackTrace();}System.out.println("This is B");c.countDown();}});try {c.await();}catch (InterruptedException e){}System.out.println("This is main");} }2. 同步屏障CyclicBarrier
可循環(huán)使用的屏障。它要做的事情,讓一組線程到達(dá)屏障時(shí)被阻塞,直到最后一個(gè)線程到達(dá)屏障時(shí),屏障才會打開,所有被屏障攔截的線程才會繼續(xù)運(yùn)行。
默認(rèn)構(gòu)造方法CyclicBarrier(int parties),其參數(shù)表示屏障攔截的線程數(shù),每個(gè)線程調(diào)用await方法告訴CyclicBarrier已經(jīng)到達(dá)屏障,然后當(dāng)前線程阻塞。
public class CylicBarrierTest {static CyclicBarrier c = new CyclicBarrier(2);static ExecutorService pool = Executors.newFixedThreadPool(2);public static void main(String args[]){pool.execute(new Runnable() {public void run() {System.out.println("this is A");try {c.await();System.out.println("this is Aa");}catch (Exception e){e.printStackTrace();}}});pool.execute(new Runnable() {public void run() {System.out.println("this is B");try {c.await();System.out.println("this is Bb");}catch (Exception e){e.printStackTrace();}}});pool.shutdown();} }3. CountDownLatch vs CyclicBarrier
CountDownLatch的計(jì)數(shù)器只使用一次,而CyclicBarrier的計(jì)數(shù)器可以使用reset方法重置,重復(fù)使用
4. 控制線程并發(fā)數(shù)的信號量 Semaphore
控制有限哥線程使用資源。使用方法 Semaphore ss = new Semaphore(N), N表示最大的并發(fā)量,每個(gè)線程使用資源前調(diào)用ss.acquire()方法獲取權(quán)限,使用完后調(diào)用ss.release()方法釋放權(quán)限。
5. 線程間的數(shù)據(jù)交換Exchanger
它提供一個(gè)同步點(diǎn),在這個(gè)同步點(diǎn),兩個(gè)線程可以交換彼此的數(shù)據(jù)。
public class ExchangeTest {private static final Exchanger<String> exgr = new Exchanger<String>();private static ExecutorService pool = Executors.newFixedThreadPool(2);public static void main(String args[]){pool.execute(new Runnable() {public void run() {String A = "銀行流水A";try {A = exgr.exchange(A);System.out.println("A 當(dāng)前的值:" + A);}catch (InterruptedException e){}}});pool.execute(new Runnable() {public void run() {String B = "銀行流水B";try {B = exgr.exchange(B);System.out.println("B 當(dāng)前的值:" + B);}catch (InterruptedException e){}}});pool.shutdown();}轉(zhuǎn)載于:https://www.cnblogs.com/graph/p/7086209.html
總結(jié)
以上是生活随笔為你收集整理的java中常用的并发工具类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript 中的各种width
- 下一篇: 常用模块-----configparse