学习线程肯定要了解JUC(java.util.concurrent),那我们来了解他里面的一些能用到的类吧,最常用到的Thread我们就不说了,大家应该都了解,主要讲一些能用到,但不常用的。主要就是讲讲之前没写到的一些,哈哈。
首先是CountDownLatch,这个使用到的比较多,就类似于一个门上面我上了好多把锁,你只有把所有的锁都打开才能进门去。看上面的代码每个线程执行完,执行一下countDown方法,就相当于减一,直到减到0,然后await方法就是等着他减到0才往后面走,所以这里并不是说一个线程只能countdown一次。只要减到0 他都会往后面走。只要把锁都打开了,那就能进门去,不在乎是谁开的锁,开了几把锁。
cyclicBarrier这个类大家可能有些陌生,翻译过来就是循环栅栏,可以设定一个数量,当线程数量达到这个数量后才会运行,数量不够就会等着,至于等多久,可能是天荒地老吧。想了解的可以自己去找资料看看。
phaser是分阶段执行,就是有的线程执行第一个阶段,有些线程执行第二个阶段,在写遗传算法的时候可能会用到他。这个可能不是太好理解,直接看demo吧
看图就是先定义了人在婚礼上要做的事,然后重写了阶段的方法,定义那些阶段,最后8个客人来参加婚礼,bulkRegister注册有多少人要来,arriveAndDeregister就是解除了注册。arriveAndAwaitAdvance就是我做完事了,要等着别人,等到都做完了再一起去下个阶段,不多讲了,这个用到的不多,即使去面试也不会有人问的。
下面的划重点,要考的。ReadWriteLock读写锁,这个大家都很熟悉吧,这也可以叫共享锁和排它锁,读锁是共享锁,写锁是排他锁。读锁允许其他读的操作一起来,但是写的操作不允许。
这里的demo简单模拟了18个读操作和2个写操作,执行结果就是读操作几乎一起完成,而写的操作是一个一个来的。这也是为了保证数据一致性。读锁则是为了提高效率,在秒杀的时候读写锁的作用就可以体现出来
semaphore直译过来是信号灯,我的理解呢就是大家要听他指挥,他可以控制有多少线程可以一起执行,acquire方法就是获取到了批准,可以执行,执行完了之后要调用release方法给他还回去,让其他线程使用。相信聪明的大家知道了已经知道了他的应用场景,限流可能是个不错的选择。
exchanger是交换器,可以交换两个线程里的数据。这个用到的很少,就是两个线程阻塞然后交换数据这么个过程,你可以把exchanger 当成一个容器,两个线程分别把数据交给他来交换数据。