- CountDownLatch 跟join的區(qū)別
CountDownLatch用處跟join很像等舔,但是CountDownLatch更加靈活骚灸,如果子線程有多個階段a、b软瞎、c; 那么我們可以實現(xiàn)在a階段完成后(在a階段后 逢唤,b、c階段之前涤浇, latch.countDown();),就可以往下運行魔慷,主線程并不用等子線程把b只锭、c階段都跑完。
latch.countDown() 其實是state -1 操作院尔,latch.await() 其實一直在判斷state == 0 如果為0就不再等待向下執(zhí)行蜻展,基于AQS實現(xiàn)。
以下代碼展示的是跟join()用處相同邀摆。
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(2);
new Thread() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "sleep 3s");
Thread.sleep(3000);
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
new Thread() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + "sleep 3s");
Thread.sleep(3000);
latch.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
System.out.println(Thread.currentThread().getName() + "我是main線程");
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main線程結束了纵顾。。栋盹。");
}
}
- CountDownLatchTest result
main我是main線程
Thread-1sleep 3s
Thread-0sleep 3s
main線程結束了施逾。。例获。
- 感覺Semaphore類汉额,可以做限流,像令牌token一樣
import java.util.concurrent.Semaphore;
public class SemaphoreTest {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(5);
for (int i = 0; i < 8; i++) {
new Work(i,semaphore).start();
}
}
static class Work extends Thread {
int num;
Semaphore sem;
public Work(int num, Semaphore sem) {
this.num = num;
this.sem = sem;
}
@Override
public void run() {
try {
sem.acquire();
System.out.println(Thread.currentThread().getName() +" worker.NO."+ String.valueOf(num)+" 占用了機器榨汤,開始生產蠕搜。。收壕。");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +" worker.NO."+ String.valueOf(num)+" 釋放了機器妓灌。");
sem.release();
}
}
- Semaphore result
Thread-0 worker.NO.0 占用了機器轨蛤,開始生產。虫埂。祥山。
Thread-1 worker.NO.1 占用了機器,開始生產告丢。枪蘑。。
Thread-2 worker.NO.2 占用了機器岖免,開始生產岳颇。。颅湘。
Thread-3 worker.NO.3 占用了機器话侧,開始生產。闯参。瞻鹏。
Thread-4 worker.NO.4 占用了機器,開始生產鹿寨。新博。。
Thread-0 worker.NO.0 釋放了機器脚草。
Thread-5 worker.NO.5 占用了機器赫悄,開始生產。馏慨。埂淮。
Thread-1 worker.NO.1 釋放了機器。
Thread-6 worker.NO.6 占用了機器写隶,開始生產倔撞。。慕趴。
Thread-2 worker.NO.2 釋放了機器痪蝇。
Thread-7 worker.NO.7 占用了機器,開始生產秩贰。霹俺。。
Thread-3 worker.NO.3 釋放了機器毒费。
Thread-4 worker.NO.4 釋放了機器丙唧。
Thread-5 worker.NO.5 釋放了機器。
Thread-7 worker.NO.7 釋放了機器觅玻。
Thread-6 worker.NO.6 釋放了機器想际。