JDK并发包---(7)允许多个线程同时访问的:信号量(Semaphore)

来源:互联网 发布:网络运维主要做什么 编辑:程序博客网 时间:2024/05/18 01:55
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;public class SemaphoreDemo implements Runnable {final Semaphore semaphore = new Semaphore(5);@Overridepublic void run() {try {semaphore.acquire();Thread.sleep(2000); //模拟耗时操作System.out.println(Thread.currentThread().getName() + ": done!");} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release();}}public static void main(String args[]) {ExecutorService executorService = Executors.newFixedThreadPool(20);final SemaphoreDemo semaphoreDemo = new SemaphoreDemo();for (int index = 0; index < 20; index++) {executorService.submit(semaphoreDemo);}executorService.shutdown();}}


以下是JDK官方文档给的一个例子:

import java.util.concurrent.Semaphore;public class Pool {private static final int MAX_AVAILABLE = 100;private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);public Object getItem() throws InterruptedException {available.acquire();return getNextAvailableItem();}public void putItem(Object x) {if (markAsUnused(x))available.release();}// Not a particularly efficient data structure; just for demoprotected Object[] items = new Object[MAX_AVAILABLE];protected boolean[] used = new boolean[MAX_AVAILABLE];protected synchronized Object getNextAvailableItem() {for (int i = 0; i < MAX_AVAILABLE; ++i) {if (!used[i]) {used[i] = true;return items[i];}}return null; // not reached}protected synchronized boolean markAsUnused(Object item) {for (int i = 0; i < MAX_AVAILABLE; ++i) {if (item == items[i]) {if (used[i]) {used[i] = false;return true;} elsereturn false;}}return false;}}





0 0
原创粉丝点击