JUC包下的CountDownLatch,CyclicBarrier,Semaphore
阿新 • • 發佈:2022-04-29
①.從CountDownLatch的設計來看,可以做彙總的操作,例如計算員工工資,這邊啟動多個執行緒同時計算等所有執行緒執行完畢之後,計算需要發放的總額
final ConcurrentHashMap<String, Integer> resultMap = new ConcurrentHashMap<String, Integer>(); final CountDownLatch c = new CountDownLatch(10); final Random r = new Random(); for (int i = 0; i < 10; i++) { new Thread(new Runnable() { @Override public void run() { try { String sub =Thread.currentThread().getName().substring(Thread.currentThread().getName().indexOf("-")+1); System.out.println("threadName:" + Thread.currentThread().getName()); if(Integer.parseInt(sub) %2 == 0){ System.out.println(Thread.currentThread().getName()+" wait 2s"); Thread.sleep(2000); }else{ System.out.println(Thread.currentThread().getName()+" wait 0.5s"); Thread.sleep(500); } resultMap.put(Thread.currentThread().getName(), r.nextInt(10000)); c.countDown(); } catch (Exception e) { e.printStackTrace(); } } }).start(); } c.await(); System.out.println("n***********************n"); int sum = 0; for(String key :resultMap.keySet()){ Integer num = resultMap.get(key); sum += num; System.out.println(num); } System.out.println("end:"+sum);
控制檯: threadName:Thread-2 threadName:Thread-4 Thread-2 wait 2s threadName:Thread-3 Thread-3 wait 0.5s threadName:Thread-6 Thread-6 wait 2s threadName:Thread-1 Thread-1 wait 0.5s threadName:Thread-0 Thread-0 wait 2s Thread-4 wait 2s threadName:Thread-8 Thread-8 wait 2s threadName:Thread-7 Thread-7 wait 0.5s threadName:Thread-5 Thread-5 wait 0.5s threadName:Thread-9 Thread-9 wait 0.5s *********************** 8881 7993 3441 8408 100 1074 6542 4448 4216 2839 end:47942
②.CyclicBarrier可以用來做初始化操作之後,所有的執行緒統一執行:
System.out.println("init finish."); System.out.println("************************"); final CyclicBarrier cb = new CyclicBarrier(10); for (int i = 0; i < 10; i++) { new Thread(new Runnable() { @Override public void run() { try { System.out.println("ThreadName:" + Thread.currentThread().getName()); Thread.sleep(3000); cb.await(); System.out.println("ThreadName:" + Thread.currentThread().getName() + ",end!"); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } } }).start(); }
控制檯:
init finish.
************************
ThreadName:Thread-0
ThreadName:Thread-1
ThreadName:Thread-2
ThreadName:Thread-3
ThreadName:Thread-4
ThreadName:Thread-5
ThreadName:Thread-6
ThreadName:Thread-7
ThreadName:Thread-8
ThreadName:Thread-9
ThreadName:Thread-7,end!
ThreadName:Thread-1,end!
ThreadName:Thread-2,end!
ThreadName:Thread-8,end!
ThreadName:Thread-9,end!
ThreadName:Thread-4,end!
ThreadName:Thread-3,end!
ThreadName:Thread-0,end!
ThreadName:Thread-6,end!
ThreadName:Thread-5,end!
③.Semaphore(訊號量)
//構造方法permits表示一次性接受幾個執行緒通過,比如有20個執行緒,permits=5,那麼則表示一次性可以有五個執行緒通過,若為1那麼作用相當於是一把鎖,
new Semaphore(permits);
acquire相當於是用來獲取一個令牌,每獲取一個令牌則減少一個,當所有令牌用完之後,剩餘執行緒進入等待,直到有其他執行緒執行完畢並且歸還令牌,剩餘執行緒準備搶奪令牌以便執行,
ExecutorService exec = Executors.newCachedThreadPool();
// 只能5個執行緒同時訪問
final Semaphore semp = new Semaphore(5);
for (int i = 0; i < 20; i++) {
final int NO = i;
Runnable run = new Runnable() {
public void run() {
try {
// 獲取許可
semp.acquire();
System.out.println("No: " + (NO+1));
Thread.sleep(2000);
// 訪問完後,釋放
semp.release();
System.out.println("------------");
System.out.println("availability:" + semp.availablePermits());
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
exec.execute(run);
}
// 退出執行緒池
exec.shutdown();
從控制檯可以看出,第一次5個執行緒一起執行,後面執行緒的執行受上一次執行緒執行並且釋放令牌時間的影響 ,等所有執行緒執行完畢則顯示共有五個令牌可以使用
No: 1
No: 2
No: 4
No: 3
No: 5
------------
No: 8
No: 6
------------
availability:0
------------
availability:0
------------
------------
availability:0
availability:0
availability:0
No: 10
No: 7
No: 9
No: 12
------------
availability:0
------------
No: 11
No: 13
------------
------------
availability:0
------------
availability:0
No: 15
availability:0
No: 14
availability:1
------------
No: 16
availability:0
------------
No: 18
No: 17
------------
availability:0
------------
availability:0
availability:0
No: 19
------------
No: 20
availability:0
------------
availability:1
------------
------------
availability:3
availability:3
------------
availability:4
------------
availability:5