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

多线程之生产者消费者

阅读更多
也是一个笔试题,诸多借口没做好。还是自己没理解透多线程。吾日三省吾身。
代码很多copy JDK6.0的API,也有改写一点点。
class Product {}

/**
 *该类是JDK6.0API中的Condition中的示例。
 *此外现成的BlockingQueue的实现:用于生产者-使用者队列,而且是线程安全的。
 *BlockingQueue的实现的所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。
 */
class Storage<T>
{
	private int capacity;
	private int count;
	private T[] items;
	int putptr, takeptr;
	
	private Lock lock = new ReentrantLock();
	private Condition notFull  = lock.newCondition(); 
	private Condition notEmpty = lock.newCondition(); 
	
	public Storage(int capacity,Class<?> type)
	{
		this.capacity=capacity;
		items=(T[])Array.newInstance(type, capacity);	
	}
	 
	public void put(T x) throws InterruptedException 
	{
		lock.lock();
		try 
		{
			while (count == capacity) 
				notFull.await();
			items[putptr] = x; 
			if (++putptr == capacity) 
				putptr = 0;
			++count;
			notEmpty.signal();
	    } 
		finally 
	    {
	       lock.unlock();
	    }
	}

	public T take() throws InterruptedException 
	{
		lock.lock();
		try 
		{
			while (count == 0) 
				notEmpty.await();
			T x = items[takeptr]; 
			if (++takeptr == capacity) 
				takeptr = 0;
			--count;
			notFull.signal();
			return x;
	    }
		finally 
		{
			lock.unlock();
	    }
	}
}

/**
 * 生产者、消费者来自JDK6.0 API BlockingQueue里的示例
 */
class Producer implements Runnable 
{
	public void run() 
	{		
		while(!Thread.currentThread().isInterrupted()) 
		{
			try{
				cLock.lockInterruptibly();
				try{
					if(count>32)
					{
						Thread.currentThread().interrupt();
						System.out.println(name+":退出");
					}
					storage.put(produce());
				}finally{cLock.unlock();}
			}catch (InterruptedException ex){Thread.currentThread().interrupt(); }
		}		
	}
	
	private final Storage<Product> storage;
	private String name;
	private static int count;
	private static Lock cLock=new ReentrantLock() ;
	public Producer(Storage<Product> storage,String name) 
	{ 
		this.storage=storage;
		this.name=name;
	}
	private Product produce() throws InterruptedException 
	{
		Thread.sleep(600);
		cLock.lockInterruptibly();
		try{
			count++;
			System.out.println(name+"生产第"+count+"个");
			return new Product();
		}finally{cLock.unlock();}		
	}	  
}

class Consumer implements Runnable 
{
	public void run() 
	{		
		while(!Thread.currentThread().isInterrupted())
		{				
			try{
				cLock.lockInterruptibly();
				try{
					if(count>32)
					{
						Thread.currentThread().interrupt();
						System.out.println(name+":退出");
					}
					consume(storage.take());
				}finally{cLock.unlock();}
			} catch (InterruptedException ex){Thread.currentThread().interrupt(); }
		}	
	}
	
	private final Storage<Product> storage;
	private String name;
	private static int count;
	private static Lock cLock=new ReentrantLock() ;
	public Consumer(Storage<Product> storage,String name) 
	{ 
		this.storage=storage;
		this.name=name;
	}	
	void consume(Product product) throws InterruptedException 
	{
	   Thread.sleep(800);
	   cLock.lockInterruptibly();
	   try{
		   count++;
		   System.out.println(name+"消费第"+count+"个");
	   }finally{cLock.unlock();}	
	}	
}

public class Cs 
{
	public static void main(String[] args)
	{	
		Storage<Product> q = new Storage<Product>(20,Product.class);
		Producer p = new Producer(q,"p");
		Consumer c1 = new Consumer(q,"c1");
		Consumer c2 = new Consumer(q,"c2");
		new Thread(p).start();
		new Thread(c1).start();
		new Thread(c2).start();
	}	
}

分享到:
评论

相关推荐

    c#多线程之生产者消费者

    "生产者消费者"模式是多线程应用中一个经典的范例,它通过线程间的协作来实现数据处理的高效与同步。这个模式的核心思想是将任务分为两个角色:生产者(Producer)和消费者(Consumer)。生产者负责生成数据,而消费...

    java多线程实现生产者和消费者

    在并发编程中,"生产者-消费者"模式是一种经典的解决问题的范式,用于协调两个或更多线程间的协作,其中一部分线程(生产者)生成数据,另一部分线程(消费者)消费这些数据。 生产者-消费者模型的核心在于共享资源...

    Java多线程实现生产者消费者

    本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...

    JAVA多线程之生产者消费者模型.docx

    生产者消费者模型是多线程编程中的一个经典设计模式,主要用来解决生产者(生产数据的线程)和消费者(消费数据的线程)之间的同步和通信问题。在这个模型中,生产者生产产品并将其放入一个共享的容器,而消费者则从...

    多线程简易实现生产者消费者模式

    生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...

    Linux 多线程实现生产者消费者模式.pdf

    Linux多线程实现生产者消费者模式涉及到操作系统中的多个重要知识点,包括多线程编程、生产者消费者模型、互斥量、条件变量等。在Linux环境下,这些功能可以通过POSIX线程(pthread)库来实现。下面详细解释这些知识...

    java多线程经典模型生产者消费者

    java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...

    多线程实现生产者消费者

    这个项目提供了一个基础的多线程生产者消费者模型实现,可以帮助开发者理解如何在Java中实现并发编程,同时也为解决复杂并发问题提供了实践基础。通过分析和修改这个代码,我们可以深入学习多线程编程的细节,提升...

    生产者和消费者模式多线程

    创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue&lt;String&gt; queue; public Producer(BlockingQueue&lt;String&gt; queue) { this....

    12.2 Qt5多线程:使用信号量实现生产者和消费者

    生产者-消费者问题是并发编程中的一个经典模型,它描述了两个或多个线程之间的协作,其中一个或多个线程(生产者)负责生成数据,而其他线程(消费者)则负责处理这些数据。在实际应用中,这可以对应于例如数据生成...

    java多线程实现生产者消费者关系

    在实际应用中,我们常常会遇到一种典型的多线程问题——生产者消费者模型。这个模型描述了两种类型的线程:生产者线程负责创建或生产资源,而消费者线程则负责消耗这些资源。在Java中,我们可以利用同步机制来实现...

    java多线程实现生产者消费者问题

    用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题

    java多线程(生产者与消费者)

    生产者消费者模式是一种设计模式,它描述了两个不同类型的线程如何协作完成工作:生产者负责生成数据,而消费者负责消耗这些数据。为了使这个模式在多线程环境下安全运行,我们需要使用Java中的同步机制。 1. **...

    java实现多线程经典模型生产者消费

    java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...

    操作系统:多线程处理生产者消费者,java实现

    基本满足操作系统课上要求,java实现的生产者消费者模型。

    Linux c语言多线程实现生产者/消费者问题

    以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...

    多线程解决生产者与消费者问题

    本文通过多线程方法解决了生产者与消费者之间同步的问题

    生产者-消费者多线程处理

    在本场景中,我们关注的是一个经典的多线程问题——"生产者-消费者"模式。这个模式是解决资源管理与同步问题的一个有效策略,它在操作系统、并发编程和分布式系统等领域广泛应用。 生产者-消费者模型涉及到两个主要...

    多线程讲生产者与消费者

    多线程生产者与消费者,,生产者和消费者的解答网络上有多种线程版本,但却没看到进程版本,所以我就来填补这一“空白”了。PS:使用进程版本的另一个重要原因是,想顺便复习下共享内存。 我们使用信号量来同步,用...

Global site tag (gtag.js) - Google Analytics