マルチスレッドのSemaphore(信号量)応用
6466 ワード
(1)業務上の需要:20人が切符を買いに行くが、窓口は二つしかない.二人の中の一人が買った後、残りの18人の一人は引き続き購入することができる.
Semaphore(信号量):現在同時にアクセスするための数、同時アクセス量の制御
適用シーン:ストリーム制限または同時スレッド数の制御
Semaphore(信号量):現在同時にアクセスするための数、同時アクセス量の制御
package com.guoanjia.common.utils;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
* @author syliu
* @Title:
* @Package SemaphoreDemo
* @create 2018/5/14 0014
*/
public class SemaphoreDemo {
/**
*
*/
class SemaphoreRunnable implements Runnable {
//
private Semaphore semaphore;
//
private int usernum;
public SemaphoreRunnable(Semaphore semaphore, int usernum) {
this.semaphore = semaphore;
this.usernum = usernum;
}
@Override
public void run() {
try {
// ,
semaphore.acquire();
PrintLogger.info(" 【" + usernum + "】 ");
Thread.sleep((long) (Math.random() * 10000));
PrintLogger.info(" 【" + usernum + "】 , ");
// ,
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void execute() {
final Semaphore semaphore = new Semaphore(2);
//
final ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 1; i < 21; i++) {
executorService.execute(new SemaphoreRunnable(semaphore, i));
}
//
executorService.shutdown();
}
public static void main(String[] args) {
final SemaphoreDemo semaphoreDemo = new SemaphoreDemo();
semaphoreDemo.execute();
}
}
適用シーン:ストリーム制限または同時スレッド数の制御