java线程之Semaphore

来源:互联网 发布:c语言计算器程序代码 编辑:程序博客网 时间:2024/05/21 10:22

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() {@Overridepublic 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 离开座位到终点站了


0 0
原创粉丝点击