java线程之Semaphore

本文通过一个公交车上的乘客上下车模拟场景,演示了如何利用Semaphore来实现线程间的同步,确保有限资源的有效分配和使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 离开座位
到终点站了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值