Semaphore---信号量常用方法总结(1)--Semapore类常用方法--acquire()和acquire(int permits)

Semaphore此类的主要作用是限制线程的并发数量
Semaphore类发放许可的计算方式是“减法”操作

acquire(int permits)作用是每调用一次就使用permits个许可
acquire()作用是每调用一次就使用1个许可

package com.example.demo.ThreadTest.Semaphore;

import java.util.concurrent.*;

/**
 *@Description TODO
 *@Author muyou
 *@DATE 2020/10/14 9:33
 *@Version 1.0
 *类Semphore的同步性
 **/
public class SemaphoreTest1 implements Runnable{
    
    

    /**
     * permits表示同一时间最多允许多少个线程同时执行acquire()和release()之间的代码,
     * 构造函数后边还可以跟上,Boolean值,true表示使用公平信号量,false使用非公平信号量
     * 公平信号量作用是:线程启动顺序与调用semaphore.acquire();的顺序有关,先启动的线程优先获得许可
     *、new Semaphore(1);最多允许1个线程执行acquire()和release()之间的代码
     */
    private Semaphore semaphore = new Semaphore(1);
    private volatile int i = 1;
    /**
     * 多线程中的同步概念:排着队去执行一个任务,执行任务是一个一个执行,并不能并发执行
     */
    public void testMethod(){
    
    
        try {
    
    
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName()+"进入执行,时间为"+System.currentTimeMillis());
            i = i+1;
            System.out.println(Thread.currentThread().getName()+"修改共享变量的值为:" + i);
            TimeUnit.SECONDS.sleep(1);
            System.out.println(Thread.currentThread().getName()+"执行完毕时间为:"+System.currentTimeMillis());
            semaphore.release();
        }catch (InterruptedException e){
    
    
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
    
    
        testMethod();
    }

    public static void main(String[] args) {
    
    
        SemaphoreTest1 semaphoreTest1 = new SemaphoreTest1();
        ExecutorService executorService = new ThreadPoolExecutor(4,4,10,TimeUnit.SECONDS,new ArrayBlockingQueue<>(4));
        for (int i = 0; i < 3; i++) {
    
    
            executorService.execute(semaphoreTest1);
        }
        executorService.shutdown();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42163781/article/details/109078867
今日推荐