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
 

你可能感兴趣的:(java)