1.闭锁CountDownLatch public CountDownLatch(int count):需要等待的线程个数 public void countDown() : 等待的计数器减一 public void await() throws InterruptedException: 调用await方法的线程会阻塞直到计数器值减为0 CountDownLatch的对象当计数器值减为0时,不可恢复。 2.循环栅栏CyclicBarrier public CyclicBarrier(int parties, Runnable barrierAction) parties:同时等待的线程个数 barrierAction:恢复执行之前,随机挑选一个线程执行任务 CyclicBarrier值可以恢复 3.Exchanger-线程交换器 两两线程配对后交换数据再同时恢复执行。 若线程调用Exchanger.exchange(),缓冲区只有一个线程,则当前线程阻塞 直到有另一个线程调用Exchanger.exchange() 4.Semaphore-信号量 public Semaphore(int permits) permits表示许可个数(同时控制的资源个数) acquire()获取许可 release()释放许可
信号量的代码测试;
package Chat; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; //工人工作任务 class SemaphoreTask implements Runnable{ private Semaphore semaphore; public SemaphoreTask(Semaphore semaphore) { this.semaphore = semaphore; } @Override public void run() { try { semaphore.acquire (); System.out.println (Thread.currentThread ().getName ()+"占用一台设备生产"); TimeUnit.SECONDS.sleep (2); System.out.println (Thread.currentThread ().getName ()+"生产完毕,释放设备"); semaphore.release (); } catch (InterruptedException e) { e.printStackTrace (); } } } public class SemaphoreTest { public static void main(String[] args) { Semaphore semaphore=new Semaphore (5); SemaphoreTask task=new SemaphoreTask (semaphore); for(int i=0;i<8;i++){ new Thread (task,"工人"+(i+1)).start (); } } } 结果: 工人2占用一台设备生产 工人3占用一台设备生产 工人4占用一台设备生产 工人5占用一台设备生产 工人1占用一台设备生产 工人3生产完毕,释放设备 工人5生产完毕,释放设备 工人7占用一台设备生产 工人1生产完毕,释放设备 工人2生产完毕,释放设备 工人8占用一台设备生产 工人4生产完毕,释放设备 工人6占用一台设备生产 工人7生产完毕,释放设备 工人8生产完毕,释放设备 工人6生产完毕,释放设备
Process finished with exit code 0