Semaphore是信号量,用于线程间同步。

例子,公交车上大概有24个座位,但是车上总共有40个人,那么,只要有一个人下车,另一个人就能得到一个座位,假设到终点站之前,每个人都能坐下。

代码如下:

package com.concurrent;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

import junit.framework.TestCase;

public class TestSemaphore extends TestCase {
	private static final int TOTAL_SEAT = 26;

	private static final int TOTAL_PASSENGER = 40;

	public void testSemaphore() {
		ExecutorService executorService = Executors.newFixedThreadPool(TOTAL_PASSENGER);
		final Semaphore semaphore = new Semaphore(TOTAL_SEAT);
		final CountDownLatch cdl = new CountDownLatch(TOTAL_PASSENGER);
		final Random random = new Random();

		for (int i = 0; i < TOTAL_PASSENGER; i++) {
			final int index = i + 1;
			Runnable r = new Runnable() {

				@Override
				public void run() {
					try {
						semaphore.acquire();
						System.out.println("乘客" + index + " 坐下");
						Thread.sleep(random.nextInt(10) * 1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					} finally {
						System.out.println("乘客" + index + " 离开座位");
						semaphore.release();
						cdl.countDown();
					}
				}
			};
			executorService.submit(r);
		}
		executorService.shutdown();

		try {
			cdl.await();
			System.out.println("到终点站了");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}



输出:

乘客2 坐下
乘客1 坐下
乘客3 坐下
乘客5 坐下
乘客4 坐下
乘客7 坐下
乘客6 坐下
乘客8 坐下
乘客10 坐下
乘客11 坐下
乘客9 坐下
乘客11 离开座位
乘客13 坐下
乘客12 坐下
乘客17 坐下
乘客14 坐下
乘客15 坐下
乘客16 坐下
乘客18 坐下
乘客19 坐下
乘客20 坐下
乘客21 坐下
乘客22 坐下
乘客24 坐下
乘客23 坐下
乘客27 坐下
乘客26 坐下
乘客25 坐下
乘客10 离开座位
乘客8 离开座位
乘客28 坐下
乘客31 坐下
乘客14 离开座位
乘客29 坐下
乘客21 离开座位
乘客12 离开座位
乘客23 离开座位
乘客33 坐下
乘客32 坐下
乘客30 坐下
乘客33 离开座位
乘客34 坐下
乘客34 离开座位
乘客35 坐下
乘客7 离开座位
乘客36 坐下
乘客26 离开座位
乘客37 坐下
乘客17 离开座位
乘客38 坐下
乘客20 离开座位
乘客39 坐下
乘客6 离开座位
乘客40 坐下
乘客30 离开座位
乘客37 离开座位
乘客4 离开座位
乘客40 离开座位
乘客18 离开座位
乘客19 离开座位
乘客16 离开座位
乘客25 离开座位
乘客35 离开座位
乘客29 离开座位
乘客2 离开座位
乘客13 离开座位
乘客39 离开座位
乘客22 离开座位
乘客36 离开座位
乘客3 离开座位
乘客28 离开座位
乘客15 离开座位
乘客24 离开座位
乘客32 离开座位
乘客1 离开座位
乘客5 离开座位
乘客9 离开座位
乘客27 离开座位
乘客31 离开座位
乘客38 离开座位
到终点站了




阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java