逐梦少年,看你能不能发现宝藏(14)

< 6; i++) {new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t 上完自习离开教室");countDownLatch.countDown();},String.valueOf(i)).start();}countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t 班长最后关门走人 。");/*1上完自习离开教室4上完自习离开教室3上完自习离开教室2上完自习离开教室0上完自习离开教室5上完自习离开教室main班长最后关门走人 。*/}}
的字面意思是可循环()使用的屏障() 。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程达到一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障的才会开门,所有被屏障拦截的线程才会继续肝活,线程进入屏障通过的await()方法 。
public class CyclicBarrierDemo {public static void main(String[] args) {//CyclicBarrier(int parties,Runnable barrierAction)CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {System.out.println("********7棵龙珠已集齐***********召唤神龙**********");});for (int i = 1; i <= 7; i++) {final int tempInt = i;new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t 收集到第:"+tempInt+"龙珠");try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}},String.valueOf(i)).start();}}}===============================================================1收集到第:1龙珠4收集到第:4龙珠5收集到第:5龙珠6收集到第:6龙珠2收集到第:2龙珠7收集到第:7龙珠3收集到第:3龙珠********7棵龙珠已集齐***********召唤神龙**********
信号量主要有两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制 。
public class SemaphoreDemo {public static void main(String[] args) {Semaphore semaphore = new Semaphore(3);//模拟三个停车位for (int i = 1; i <= 6; i++) {//模拟6个车子,抢3个车位new Thread(()->{try {//下面意思是抢到线程semaphore.acquire();System.out.println(Thread.currentThread().getName()+"\t 抢到车位");try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); }System.out.println(Thread.currentThread().getName()+"\t 停车三秒后离开车位");} catch (InterruptedException e) {e.printStackTrace();}finally {//下面意思是释放线程semaphore.release();}},String.valueOf(i)).start();}}=========================================================================1抢到车位3抢到车位2抢到车位1停车三秒后离开车位3停车三秒后离开车位2停车三秒后离开车位5抢到车位4抢到车位6抢到车位4停车三秒后离开车位6停车三秒后离开车位5停车三秒后离开车位
29.阻塞队列你知道么?
/** 1.ArrayBlockingQueue: 是一个基于数组结构的有界阻塞队列,此队列FIFO(先进先出),原则对元素进行排序 。* 2.LinkedBlockingQueue: 是一个基于链表结构的阻塞队列,此队列按照FIFO(先进先出)排序元素,吞吐量通常要高于ArrayBlockingQueue* 3.SynchronousQueue: 是一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue** 1 队列 :先进先出,栈: 先进后出* 阻塞队列,顾名思义,首先它是一个队列,而一个阻塞队列在数据结构钟所起的大致作用**Thread1Thread2*||*------Put----》BlockingQueue《-------take-----*线程1往阻塞队列钟添加元素,而线程2从阻塞队列钟移除元素* 当阻塞队列是空时,从队列中**获取**元素的操作将会被阻塞 。* 当阻塞队列是满时,往队列里**添加**元素的操作将会被阻塞** 试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素 。* 同样* 试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他线程从列中移除一个或多个元素或者完全清空队列* 后使队列重新边得空闲起来并后续新增** 2 阻塞队列*2.1 阻塞队列有没有好的一面?*在多线程领域: 所谓阻塞,在某些情况下会**挂起**线程(即阻塞),一旦条件满足,被挂起的线程又会自动**被唤醒****为什么需要BlockingQueue*好处是我们不需要关心,什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都给你一手包办了*在concurrent包发布以前,在多线程环境下,**我们每个程序员都必须去自己控制这些细节,尤其还要兼顾效率和线程安全,***而这会让我们的程序带来不小的复杂度 。**2.2 不得不阻塞,你如何管理?* */