zoukankan      html  css  js  c++  java
  • java高级---->Thread之Semaphore的使用

      Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制。今天我们就学习一下Semaphore的用法。

    java中多线程Semaphore的使用

    关于Semaphore常用的方法的介绍

    // 从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。
    acquire():Acquires a permit from this semaphore, blocking until one is available, or the thread is interrupted.
    // 释放一个许可,将其返回给信号量。
    release() :Releases a permit, returning it to the semaphore.

    一、Semaphore的简单使用

    public class SemaphoreTest {
        public static void main(String[] args) {
            Runnable runnable = new Runnable() {
                final Semaphore availableWindow = new Semaphore(5);
                int count = 1;
                @Override
                public void run() {
                    int time = (int) (Math.random() * 10 + 3);
                    int num = count++;
                    try {
                        availableWindow.acquire();
                        System.out.println("正在为第【" + num + "】个客户办理业务,需要时间:" + time + "s!");
                        Thread.sleep(time * 1000);
                        if (availableWindow.hasQueuedThreads()) {
                            System.out.println("第【" + num + "】个客户已办理完业务,有请下一位!");
                        } else {
                            System.out.println("第【" + num + "】个客户已办理完业务,没有客户了,休息中!");
                        }
                        availableWindow.release();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            };
    
            // 循环10次
            for (int i = 1; i < 10; i++) {
                new Thread(runnable).start();
            }
        }
    }

    运行的结果如下:每次运行的结果是不一样的

    正在为第【1】个客户办理业务,需要时间:3s!
    正在为第【2】个客户办理业务,需要时间:12s!
    正在为第【3】个客户办理业务,需要时间:10s!
    正在为第【4】个客户办理业务,需要时间:7s!
    正在为第【5】个客户办理业务,需要时间:3s!
    第【1】个客户已办理完业务,有请下一位!
    正在为第【6】个客户办理业务,需要时间:11s!
    第【5】个客户已办理完业务,有请下一位!
    正在为第【7】个客户办理业务,需要时间:6s!
    第【4】个客户已办理完业务,有请下一位!
    正在为第【8】个客户办理业务,需要时间:10s!
    第【7】个客户已办理完业务,有请下一位!
    正在为第【9】个客户办理业务,需要时间:12s!
    第【3】个客户已办理完业务,没有客户了,休息中!
    第【2】个客户已办理完业务,没有客户了,休息中!
    第【6】个客户已办理完业务,没有客户了,休息中!
    第【8】个客户已办理完业务,没有客户了,休息中!
    第【9】个客户已办理完业务,没有客户了,休息中!

    二、Semaphore可以当成mutual exclusion lock使用

     A semaphore initialized to one, and which is used such that it only has at most one permit available, can serve as a mutual exclusion lock.

    package com.linux.huhx.concurreny;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class SemaphoreTest1 {
        public static void main(String[] args) {
            final BusinessTask task = new BusinessTask();
            ExecutorService service = Executors.newFixedThreadPool(3);
            for (int i = 0; i < 3; i++) {
                service.execute(task);
            }
            service.shutdown();
        }
    
        private static class BusinessTask implements Runnable {
            private int count;
            Lock lock = new ReentrantLock();
            Semaphore semaphore = new Semaphore(1);
    
            @Override
            public void run() {
                try {
    //                semaphore.acquire();
                    lock.lock();
                    count ++;
                    Thread.sleep(1000);
                    System.out.println(count);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
    //                semaphore.release();
                    lock.unlock();
                }
            }
        }
    }

     运行的结果固定如下:

    1
    2
    3

    友情链接

  • 相关阅读:
    组合选择器
    pytorch识别CIFAR10:训练ResNet-34(微调网络,准确率提升到85%)
    pytorch识别CIFAR10:训练ResNet-34(准确率80%)
    深度学习识别CIFAR10:pytorch训练LeNet、AlexNet、VGG19实现及比较(三)
    深度学习识别CIFAR10:pytorch训练LeNet、AlexNet、VGG19实现及比较(二)
    深度学习识别CIFAR10:pytorch训练LeNet、AlexNet、VGG19实现及比较(一)
    MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(三)
    MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(二)
    MINIST深度学习识别:python全连接神经网络和pytorch LeNet CNN网络训练实现及比较(一)
    ubuntu 18.04安装pytorch、cuda、cudnn等
  • 原文地址:https://www.cnblogs.com/huhx/p/baseusejavasemaphor.html
Copyright © 2011-2022 走看看