Java 并发编程学习笔记(0) ----Semaphore-构造方法

Semaphore 信号量-0

1.构造方法

同步关键类 Semaphore
permits 是允许许可的意思
构造方法传入的数字是多少,则同一个时刻,只运行多少个进程同时运行指定代码
指定代码就是 在 semaphore.acquire() 和 semaphore.release()之间的代码
private Semaphore semaphore = new Semaphore(2);

package com.lhc.concurrent.semaphore;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Semaphore;

public class ConstructionService {

    private static SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

    /**
     * 同步关键类
     * permits 是允许许可的意思
     * 构造方法传入的数字是多少,则同一个时刻,只运行多少个进程同时运行指定代码
     * 指定代码就是 在 semaphore.acquire() 和 semaphore.release()之间的代码
     */
    private Semaphore semaphore = new Semaphore(2);

    public void doSomething() {
        try {
            /**
             * 在 semaphore.acquire() 和 semaphore.release()之间的代码,同一时刻只允许指定个数的线程进入,
             * 因为semaphore的构造方法是1,则同一时刻只允许一个线程进入,其他线程只能等待。
             * */
            semaphore.acquire();
            System.out.println(Thread.currentThread().getName() + ":开始执行,时间:" + getFormatTimeStr());
            Thread.sleep(2000);
            System.out.println(Thread.currentThread().getName() + ":执行结束,时间:" + getFormatTimeStr());
            semaphore.release();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static String getFormatTimeStr() {
        return sf.format(new Date());
    }
}

2.测试类


package com.lhc.concurrent.semaphore;

public class SemaphoreThread extends Thread{
    private ConstructionService constructionService;

    public SemaphoreThread(ConstructionService constructionService, String name) {
        super();
        this.constructionService = constructionService;
        this.setName(name);
    }

    public static void main(String[] args) {
        ConstructionService constructionService = new ConstructionService();
        for (int i = 0; i < 10; i++) {
            SemaphoreThread semaphoreThread = new SemaphoreThread(constructionService, "线程" + i);
            semaphoreThread.start();
        }
    }

    @Override
    public void run() {
        constructionService.doSomething();
    }
}


3.执行结果

线程0:开始执行,时间:2019-04-13 10:08:44.290
线程1:开始执行,时间:2019-04-13 10:08:44.290
线程1:执行结束,时间:2019-04-13 10:08:46.294
线程0:执行结束,时间:2019-04-13 10:08:46.294
线程3:开始执行,时间:2019-04-13 10:08:46.294
线程2:开始执行,时间:2019-04-13 10:08:46.294
线程2:执行结束,时间:2019-04-13 10:08:48.306
线程3:执行结束,时间:2019-04-13 10:08:48.306
线程5:开始执行,时间:2019-04-13 10:08:48.306
线程6:开始执行,时间:2019-04-13 10:08:48.306
线程6:执行结束,时间:2019-04-13 10:08:50.318
线程5:执行结束,时间:2019-04-13 10:08:50.318
线程4:开始执行,时间:2019-04-13 10:08:50.318
线程7:开始执行,时间:2019-04-13 10:08:50.318
线程7:执行结束,时间:2019-04-13 10:08:52.320
线程4:执行结束,时间:2019-04-13 10:08:52.320
线程8:开始执行,时间:2019-04-13 10:08:52.320
线程9:开始执行,时间:2019-04-13 10:08:52.320
线程9:执行结束,时间:2019-04-13 10:08:54.324
线程8:执行结束,时间:2019-04-13 10:08:54.324

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章