Java并发编程入门 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

信号量

信号量这个词对于计算机专业的人并不陌生,因为这个词是计算机操作系统多道程序设计中很关键很重要的词。

抽象的来讲,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。当一个线程调用Wait操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列),直到信号量大于等于一时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为释放了由信号量守护的资源。

在Java并发设计中,也存在信号量这个词。信号量为多线程协作提供了更为强大的控制。无论是什么锁,一次之允许一个线程访问,而信号量一次可以让多个线程访问。

public class Main implements Runnable{
    public static void main(String[] args){
        ExecutorService executorService= Executors.newFixedThreadPool(5);
        Main main=new Main();
        for(int i=0;i<20;i++){
            executorService.submit(main);
        }
    }
    Semaphore semaphore=new Semaphore(2);
    public void run() {
        try {
            semaphore.acquire();
            Thread.sleep(3000);
            System.out.println(Thread.currentThread().getId());
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在上述程序中Semaphore semaphore=new Semaphore(2);这一句是new一个一次可以让2个线程访问的信号量。semaphore.acquire();用来尝试获得资源,如果获得了资源就立即执行。semaphore.release();用来释放资源,当一个任务执行完毕之后就应该释方资源,这里还用到了线程池,这个知识点一会会讲解。

试运行以上成序,观察运行时间。