线程同步辅助类的使用
一、countDownLatch(减法)
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i = 0; i < 6; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"OUT_OF");
countDownLatch.countDown();
}).start();
}
countDownLatch.await();
System.out.println("Close Door");
}
}
1、可以理解成countDown()一次就减一 直到0结束
2、countDownLatch.await();可以设置超时时间 如:
countDownLatch.await(8, TimeUnit.SECONDS);
超时会抛出异常
二、CyclicBarrier(加法)
public class CyclicBarrierDemo {
public static void main(String[] args) throws BrokenBarrierException, InterruptedException {
//设置阻碍 达到数量 执行
CyclicBarrier c = new CyclicBarrier(7, () -> {
System.out.println("召唤神龙成功");
});
for (int i = 0; i < 3; i++) {
final int temp=i;
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"-----------------"+"收集第"+temp+"龙珠");
try {
c.await(4, TimeUnit.SECONDS);
} catch (InterruptedException e) {
} catch (Exception e) {
throw new RuntimeException(e);
}
;
System.out.println("第"+temp+"龙珠");
}).start();
}
}
}
1、调用一次await() 就加1 到达指定数量结束
2、c.await();也可以设置超时时间
三、Semaphore
public class SemaphoreDemo {
public static void main(String[] args) {
//线程数量
Semaphore semaphore = new Semaphore(3);
for (int s = 0; s < 6; s++) {
final int temp=s;
new Thread(()->{
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"获取第"+temp+"停车位");
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+"释放第"+temp+"停车位");
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
semaphore.release();
}
},String.valueOf(s)).start();
}
}
}
1、必须使用semaphore.acquire(); 否则线程数量不会被限制 和普通线程一样
2、如果不执行semaphore.release(); 线程永远占用一个数量
3、最多指定数量的线程 执行完释放后 进入新的线程
和线程池区别:
线程池是线程不变 这里是位置不变 线程改变