重温java知识(三十九、JUC并发编程之五:线程锁之Semaphore)

通过线程调度进行有限资源的分配与调度。

1、模拟银行办理业务(2个业务窗口,10为待办理人)的例子:

package com.mydemo;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class JUCDemo {

    public static void main(String[] args) {

        // 2个可用资源,采用的是非公平机制
        Semaphore semaphore = new Semaphore(2);

        // 循环创建并启动线程
        for(int i = 0; i < 10; i++){
            new Thread(()->{
                try {
                    // 资源抢占,若无资源则等待
                    semaphore.acquire();

                    // 有空闲资源
                    if(semaphore.availablePermits() >= 0){
                        System.out.println("【" + Thread.currentThread().getName() + "】抢占资源成功");
                    }else{
                        System.out.println("【" + Thread.currentThread().getName() + "】抢占资源失败,进入等待状态!");
                    }

                    System.out.println("【" + Thread.currentThread().getName() + "】()开始进行业务办理");

                    // 业务办理延迟
                    TimeUnit.SECONDS.sleep(2);

                    System.out.println("【" + Thread.currentThread().getName() + "】业务办理结束");

                    // 释放资源
                    semaphore.release();

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, "业务办理人员:" + i).start();
        }
    }
}


你可能感兴趣的:(Java)