多线程-Semaphore(其实就是一把锁)

/**
 * 所谓的信号量,其实就是一个控制线程的数目的构造
 */
public class SemaphoreDemo {
    //用static 和final 这样就表明属于类级别的,既然是类级别的,那么可以认为是单例模式的
    //也就是最大的并发访问量是3个,即同一时间
    //构造参数:
    /**
     * 1.默认是非公平的,因为里面包含的是一个队列,要实现公平策略,初始化的时候,通过构造函数设置为true,即满足FIFO的原则
     * 2.实现单例模式:
     * 将Semaphore semaphore = new Semaphore(1),即满足单例模式
     */
    private static final Semaphore semaphore = new Semaphore(3); //并发访问的线程数3个
    //创建5个线程,利用线程池,因为创建完线程池,线程的启动即submit()或者execute()就是任务提交和线程启动的一个过程
    private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<>());

    //静态内部类
    private static class InformationThread extends Thread {
        //本身是一个普通类,当继承了Thread类之后,就变成一个任务类,即异步处理的类当然他也有自己本身的属性
        private final String name;
        private final int age;

        private InformationThread(String name, int age) {
            this.name = name;
            this.age = age;
        }

        @Override
        public void run() {
            try {
                /**
                 * 通过源码发现:
                 * acquire有两个方法类型:
                 * 一个是带参的,限制了获取共享资源的线程数
                 * 一个是不带参的,没有限制
                 * 当然是用在run方法中.
                 */
                semaphore.acquire();
                System.out.println(Thread.currentThread().getName() + ":大家好,我是" + name + "我今年" + age + "岁当前时间为:" + System.currentTimeMillis());
                Thread.sleep(1000);
                System.out.println(name + "要准备释放许可证了,当前时间为:" + System.currentTimeMillis());
                System.out.println("当前可使用的许可数为:" + semaphore.availablePermits());
                semaphore.release();
            } catch (Exception e) {
                e.getMessage();
            }
        }
    }

    public static void main(String[] args) {
        String[] name = {"李明", "王五", "张杰", "王强", "赵二", "李四", "张三"};
        int[] age = {26, 27, 33, 45, 19, 23, 41};
        for (int i = 0; i < 7; i++) {
            //创建一个对象的形式;
            /**
             * 1.利用多态的形式创建---即对象的引用(instanceof)
             * 2.利用对象本身创建
             */
            Thread thread = new InformationThread(name[i], age[i]);
            threadPool.execute(thread);
        }
    }
}

参考博客:

https://blog.csdn.net/carson0408/article/details/79475723

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值