一、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、最多指定数量的线程 执行完释放后 进入新的线程
和线程池区别:
线程池是线程不变 这里是位置不变 线程改变