`
conkeyn
  • 浏览: 1512452 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

java.util.concurrent.Semaphore

阅读更多

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

分享到:
评论

相关推荐

    java并发工具包 java.util.concurrent中文版用户指南pdf

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    java并发工具包 java.util.concurrent中文版-带书签版

    Java并发工具包(java.util.concurrent)是Java平台上用于高效、安全地处理多线程编程的重要组件。这个包包含了丰富的并发工具类,旨在帮助开发者构建高度并发的程序,提高程序的性能和可伸缩性。本资源是该工具包的...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版.pdf

    java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    java.util.concurrent 学习ppt

    Java.util.concurrent是Java 5.0引入的一个重要包,它为多线程编程提供了一组高级并发工具。这个包的设计者是Doug Lea,它的出现是JSR-166的一部分,也被称作Tiger更新。Java.util.concurrent的引入是为了解决传统...

    java.util.concurrent-多线程框架.docx

    java.util.concurrent 多线程框架 java.util.concurrent 多线程框架是 Java 语言中用于多线程编程的库。该库提供了多种线程池实现、并发集合、同步器、lock 等多种机制,以便开发者更方便地编写高效、可靠的多线程...

    Java并发工具包java.util.concurrent用户指南中英文对照阅读版

    本资源包含两个 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 测试源文件

    Java.util.concurrent(JUC)是Java平台中的一个核心包,专门用于处理多线程并发问题。这个包包含了大量的工具类和接口,极大地简化了并发编程的复杂性,提高了程序的性能和可伸缩性。本测试源文件主要是针对JUC并发...

    java.util.concurrent介绍(重要).pdf

    总之,`java.util.concurrent` 提供的工具使得并发编程变得更加容易和高效,是 Java 并发编程的基石,无论是对于初学者还是经验丰富的开发者,理解和掌握这个包都是非常重要的。通过熟练运用这些工具,开发者可以...

    JBuider第七章:Java.util包.rar

    Java.util.concurrent包(虽然不是直接在Java.util下,但密切相关)包含了一系列线程安全的数据结构和并发工具,如Semaphore、ExecutorService、CountDownLatch等,极大地简化了多线程编程。 8. **枚举Set**: ...

    关于 java.util.concurrent 您不知道的 5 件事,第 2 部分

    在Java编程领域,`java.util.concurrent`包是并发编程的核心工具包,提供了高效、线程安全的类和接口,使得开发者能够更容易地处理多线程环境。本篇将深入探讨这个包中一些鲜为人知的知识点,以帮助你提升并发编程的...

    java.util源码-java-util:javautil源代码

    8. **并发编程**:`java.util.concurrent`包虽然不在`java.util`下,但与之紧密相关,提供了高级并发工具,如ExecutorService、Future、Semaphore和CyclicBarrier。 9. **事件模型**:`java.util.EventObject`和`...

    Java多线程Semaphore工具的使用详解.rar

    Java多线程编程是开发高并发应用的关键技术之一,Semaphore工具是Java并发包(java.util.concurrent)中的一个重要组件,用于控制同时访问特定资源的线程数量。本篇将深入讲解Semaphore的基本概念、工作原理以及如何...

    30个常用java工具类

    8. **`java.util.concurrent`** 包:提供并发工具类,如`ExecutorService`、`Future`和`Semaphore`,帮助管理线程和控制并发。 9. **`java.util.Map.Entry`**:表示Map中的键值对,常用于遍历Map。 10. **`java....

    我的多线程小游戏

    为了防止地鼠在被点击时同时出现在两个位置,或者在被点击后还在显示,需要使用锁机制(如`synchronized`关键字)或信号量(如`java.util.concurrent.Semaphore`)来确保线程间的正确交互。此外,还可以利用`java....

    java工具类集合

    6. `java.util.concurrent` 包: - 这个包包含了许多并发编程相关的工具类,如`ExecutorService`, `Semaphore`, `CountDownLatch`, `CyclicBarrier`等,以及线程池`ThreadPoolExecutor`。 7. `java.util.Random`:...

    Java常用工具类大全,工作5年精心整理.zip

    4. **`java.util.concurrent`包**:这个包包含了线程安全的数据结构(如ConcurrentHashMap)和并发工具类,如ExecutorService、Semaphore、CyclicBarrier等,用于高效地处理多线程场景。 5. **`java.util.logging....

    实现Java高并发隔离 模拟

    它可以通过`java.util.concurrent.Semaphore`类实现。 5. **原子变量(Atomic Variables)**:`java.util.concurrent.atomic`包提供了原子变量类,如`AtomicInteger`、`AtomicLong`等,它们支持原子操作,无需锁...

    java10个线程按照顺序打印1-100

    3. **Semaphore(信号量)**:`java.util.concurrent.Semaphore`类提供了一种控制同时访问特定资源的线程数量的方法。在顺序打印问题中,可以设置信号量的许可数量为1,每个线程在打印前获取许可,打印完成后释放...

    JAVA多线程--信号量(Semaphore)_.docx

    import java.util.concurrent.Semaphore; public class SemaPhore { public static void main(String[] args) { // 线程池 ExecutorService exec = Executors.newCachedThreadPool(); // 只能5个线程同时访问 ...

    java工具类

    7. **`java.util.concurrent` 包**: 这个包包含了线程安全的数据结构和并发工具类,如`ConcurrentHashMap`, `ExecutorService`, `Future`, `CountDownLatch`, `Semaphore`等,用于构建多线程和并行应用程序。 8. ...

Global site tag (gtag.js) - Google Analytics