juc包下四大常用工具类
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
