`
conkeyn
  • 浏览: 1519992 次
  • 性别: 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用户指南中英文对照阅读版.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的引入是为了解决传统...

    The java.util.concurrent Synchronizer Framework

    Java平台在J2SE 1.5版本中引入了`java.util.concurrent`包,这是一系列中等层次的并发支持类集合,通过Java社区过程(Java Community Process, JCP)的Java规范请求(Java Specification Request, JSR)166创建而成...

    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...

    The java.util.concurrent synchronizer framework.pdf

    关于AbstractQueuedSynchronizer,它是java.util.concurrent包中并发控制的核心组件,为Java并发工具类提供了底层机制支持,例如ReentrantLock、Semaphore、CountDownLatch等,都依赖于这个框架来实现同步。...

    java.util.concurrent_您不知道的5件事

    ### Java.util.concurrent_您不知道的5件事 #### 1. Semaphore(信号量) - **定义与作用**:`Semaphore` 类是一种控制多个线程访问共享资源的机制,它通过内部维护一个整数计数器(许可的数量)以及一组等待线程...

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

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

    java.util.concurrent 测试源文件

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

    java_util_concurrent中文版pdf

    《Java Util Concurrent中文版》是Java并发编程领域的重要参考资料,主要涵盖了Java标准库中的`java.util.concurrent`包及其相关类和接口。这个包是Java多线程编程的核心,提供了高效、安全的并发工具,帮助开发者...

    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大全.rar

    Java的`java.util.concurrent`包提供了丰富的线程工具,如`ExecutorService`、`Semaphore`、`CountDownLatch`等,帮助开发者高效地管理和控制并发。 以上各个模块的知识点相互独立,但又经常协同工作,共同构成了...

    java多线程编程总结

    - `java.util.concurrent.Semaphore`用于控制对有限资源的访问。 ##### 5. 阻塞队列 - `java.util.concurrent.BlockingQueue`接口用于在线程间共享数据。 ##### 6. 条件变量 - `java.util.concurrent.locks....

    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的基本概念、工作原理以及如何...

    米哈游笔试题目-Java方向.docx

    import java.util.concurrent.LinkedBlockingQueue; public class SafeBlockingQueue&lt;T&gt; { private final BlockingQueue&lt;T&gt; queue; public SafeBlockingQueue(int capacity) { this.queue = new ...

Global site tag (gtag.js) - Google Analytics