http://zhidao.baidu.com/question/48694020
信号量
一、问题描述
生产者-消费者问题是一个经典的进程同步问题,该问题最早由Dijkstra提出,用以演示他提出的信号量机制。
他要求设计在同一个进程地址空间内执行的两个线程。
生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。
消费者线程从缓冲区中获得物品,然后释放缓冲区。
当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。
当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出来。
package examples.ch06.example01;
import java.util.LinkedList;
import java.util.concurrent.Semaphore;
/**
* @author Administrator
*
*/
public class TestSemaphore {
static Warehouse buffer = new Warehouse();
/**
* @param args
*/
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Thread producer = new Thread(new Producer());
producer.start();
}
for (int i = 0; i < 15; i++) {
Thread consumer = new Thread(new Consumer());
consumer.start();
}
}
static class Producer implements Runnable {
static int i = 0;
@Override
public void run() {
while (true) {
i++;
try {
buffer.put(i);
System.out.println("put: " + i+" in thread: "+Thread.currentThread());
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
static class Consumer implements Runnable {
@Override
public void run() {
while (true) {
try {
Object x = buffer.take();
System.out.println("take: " + x+" in thread: "+Thread.currentThread());
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
static class Warehouse {
// 非满锁,表示如果小于10,则说明仓库没有满。
final Semaphore notFull = new Semaphore(5);
// 非空锁,表示如果大于0,则说明仓库不为空。
final Semaphore notEmpty = new Semaphore(5);
// 核心锁,与lock()、unlock()相似
final Semaphore mutex = new Semaphore(1);
final LinkedList<Object> items = new LinkedList<Object>();
/**
* 添置商品到仓库中
*
* @param x
* @throws Exception
*/
public void put(Object x) throws Exception {
notFull.acquire();
System.out.println();
mutex.acquire();
System.out.println("notFull: " + notFull.availablePermits()
+ " mutex: " + mutex.availablePermits());
try {
items.addLast(x);
} finally {
mutex.release();
notFull.release();
}
}
public Object take() throws Exception {
notEmpty.acquire();
mutex.acquire();
System.out.println("notEmpty: " + notEmpty.availablePermits()
+ " mutex: " + mutex.availablePermits());
try {
// 减少库存
if (!items.isEmpty()) {
return items.remove();
}
return null;
} finally {
mutex.release();
notEmpty.release();
}
}
}
}
f
分享到:
相关推荐
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
Java并发工具包(java.util.concurrent)是Java平台上用于高效、安全地处理多线程编程的重要组件。这个包包含了丰富的并发工具类,旨在帮助开发者构建高度并发的程序,提高程序的性能和可伸缩性。本资源是该工具包的...
java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
Java.util.concurrent是Java 5.0引入的一个重要包,它为多线程编程提供了一组高级并发工具。这个包的设计者是Doug Lea,它的出现是JSR-166的一部分,也被称作Tiger更新。Java.util.concurrent的引入是为了解决传统...
java.util.concurrent 多线程框架 java.util.concurrent 多线程框架是 Java 语言中用于多线程编程的库。该库提供了多种线程池实现、并发集合、同步器、lock 等多种机制,以便开发者更方便地编写高效、可靠的多线程...
本资源包含两个 pdf 文档,一本根据 Jakob Jenkov 最新博客 (http://tutorials.jenkov.com/java-util-concurrent/index.html) 整理的 java_util_concurrent_user_guide_en.pdf,一个中文翻译的 java_util_concurrent...
Java.util.concurrent(JUC)是Java平台中的一个核心包,专门用于处理多线程并发问题。这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发...
总之,`java.util.concurrent` 提供的工具使得并发编程变得更加容易和高效,是 Java 并发编程的基石,无论是对于初学者还是经验丰富的开发者,理解和掌握这个包都是非常重要的。通过熟练运用这些工具,开发者可以...
Java.util.concurrent包(虽然不是直接在Java.util下,但密切相关)包含了一系列线程安全的数据结构和并发工具,如Semaphore、ExecutorService、CountDownLatch等,极大地简化了多线程编程。 8. **枚举Set**: ...
在Java编程领域,`java.util.concurrent`包是并发编程的核心工具包,提供了高效、线程安全的类和接口,使得开发者能够更容易地处理多线程环境。本篇将深入探讨这个包中一些鲜为人知的知识点,以帮助你提升并发编程的...
8. **并发编程**:`java.util.concurrent`包虽然不在`java.util`下,但与之紧密相关,提供了高级并发工具,如ExecutorService、Future、Semaphore和CyclicBarrier。 9. **事件模型**:`java.util.EventObject`和`...
Java多线程编程是开发高并发应用的关键技术之一,Semaphore工具是Java并发包(java.util.concurrent)中的一个重要组件,用于控制同时访问特定资源的线程数量。本篇将深入讲解Semaphore的基本概念、工作原理以及如何...
8. **`java.util.concurrent`** 包:提供并发工具类,如`ExecutorService`、`Future`和`Semaphore`,帮助管理线程和控制并发。 9. **`java.util.Map.Entry`**:表示Map中的键值对,常用于遍历Map。 10. **`java....
为了防止地鼠在被点击时同时出现在两个位置,或者在被点击后还在显示,需要使用锁机制(如`synchronized`关键字)或信号量(如`java.util.concurrent.Semaphore`)来确保线程间的正确交互。此外,还可以利用`java....
6. `java.util.concurrent` 包: - 这个包包含了许多并发编程相关的工具类,如`ExecutorService`, `Semaphore`, `CountDownLatch`, `CyclicBarrier`等,以及线程池`ThreadPoolExecutor`。 7. `java.util.Random`:...
4. **`java.util.concurrent`包**:这个包包含了线程安全的数据结构(如ConcurrentHashMap)和并发工具类,如ExecutorService、Semaphore、CyclicBarrier等,用于高效地处理多线程场景。 5. **`java.util.logging....
它可以通过`java.util.concurrent.Semaphore`类实现。 5. **原子变量(Atomic Variables)**:`java.util.concurrent.atomic`包提供了原子变量类,如`AtomicInteger`、`AtomicLong`等,它们支持原子操作,无需锁...
3. **Semaphore(信号量)**:`java.util.concurrent.Semaphore`类提供了一种控制同时访问特定资源的线程数量的方法。在顺序打印问题中,可以设置信号量的许可数量为1,每个线程在打印前获取许可,打印完成后释放...
import java.util.concurrent.Semaphore; public class SemaPhore { public static void main(String[] args) { // 线程池 ExecutorService exec = Executors.newCachedThreadPool(); // 只能5个线程同时访问 ...
7. **`java.util.concurrent` 包**: 这个包包含了线程安全的数据结构和并发工具类,如`ConcurrentHashMap`, `ExecutorService`, `Future`, `CountDownLatch`, `Semaphore`等,用于构建多线程和并行应用程序。 8. ...