`
chriszeng87
  • 浏览: 738713 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java并发之生产者消费者

    博客分类:
  • Java
 
阅读更多

这个例子有点局限,消费者每次只能等生产者生产了n个Q后消费完这n个。

 

 

package com.test;

class Q { 
	int n; 
	boolean valueSet = false; //Q的value是不是已经设置过了
	synchronized int get() { 
		if(!valueSet) 
			try { 
				wait(); //wait until Producer produce a product and notify ,释放锁
			} catch(InterruptedException e) { 
				System.out.println("InterruptedException caught"); 
			} 
		System.out.println("Got: " + n); 
		valueSet = false; 
		notify(); 
		return n; 
	} 
	
	synchronized void put(int n) { 
		if(valueSet) 
			try { 
				wait(); 
			} catch(InterruptedException e) { 
				System.out.println("InterruptedException caught"); 
			} 
		this.n = n; 
		valueSet = true; 
		System.out.println("Put: " + n); 
		notify(); 
	} 
}

class Producer implements Runnable { 
	Q q;
	
	Producer(Q q) { 
		this.q = q; 
		new Thread(this, "Producer").start(); 
	}
	
	public void run() { 
		int i = 0; 
		while(true) { 
			q.put(i++); 
		} 
	} 
}

class Consumer implements Runnable { 
	Q q;
	
	Consumer(Q q) { 
		this.q = q; 
		new Thread(this, "Consumer").start(); 
	} 
	
	public void run() { 
		while(true) { 
			q.get(); 
		}	 
	} 
}

class PCFixed { 
	public static void main(String args[]) { 
		Q q = new Q(); 
		new Consumer(q); 
		new Producer(q); 

		System.out.println("Press Control-C to stop."); 
	} 
}

 

 

下面的方法转自《程序员面试攻略》第二版,机械工业出版社,P118-P119,应该是正确的解答:

 

生产者:

 

 

public class Producer extends Thread {
      private IntBuffer buffer;
      
      public Producer(IntBuffer buffer) {
            this.buffer = buffer;
      }
 
      public void run() {
            Random r = new Random();
            while(true) {
                    int num = r.nextInt();
                    buffer.add(num);
                    System.out.println("Produced " + num);
            }
      }
}

 

消费者:

 

public class Consumer extends Thread {
	private IntBuffer buffer;
	
	public Consumer(IntBuffer buffer) {
		this.buffer = buffer;
	}
	
	public void run() {
		while(true) {
			int num = buffer.remove();
			System.out.println("Consumed " + num);
		}
	}
}

 

缓冲区:

 

public class IntBuffer {
	private int index;
	private int[] buffer = new int[8];
	
	public synchronized void add( int num ) {
		while(index == buffer.length-1) {
			try {
				wait();
			}catch(InterruptedException e) {

			}
		}

		buffer[index++] = num;
		notifyAll();
	}

	public synchronized int remove() {
		while(index == 0) {
			try {
				wait();
			}catch(InterruptedException e) {

			}			
		}
		
		int ret = buffer[--index];
		notifyAll();
		return ret;
	}
}
这段代码允许多个生产者和多个消费者使用同一个缓冲区,解决了第一个方法的缺陷。
分享到:
评论

相关推荐

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

    这就是一个基本的Java“生产者-消费者”模型实现。通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化...

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

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

    java生产者消费者问题

    总的来说,Java生产者消费者问题是一个重要的多线程编程概念,它展示了如何通过同步和通信机制在并发环境中有效地管理资源。通过学习和实践这个模型,开发者可以提升在并发编程中的技能,更好地设计和优化多线程应用...

    java 生产者消费者问题(源码)

    Java生产者消费者问题是多线程编程中的一个经典案例,它主要展示了如何通过共享资源来实现线程间的协作。这个问题源于现实生活中的生产流水线,其中生产者负责制造产品,而消费者负责消耗这些产品。在计算机系统中,...

    java生产者消费者

    Java生产者消费者模式是一种多线程设计模式,它在并发编程中被广泛使用,用于解决资源的共享问题。...了解并熟练掌握生产者消费者模式是每个Java开发人员必备的技能之一,它能够帮助我们编写出高效、稳定的并发程序。

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

    Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...

    java生产者消费者demo

    在Java编程中,"生产者消费者问题"是一个经典的多线程同步问题,它涉及到了如何在多线程环境下有效地共享资源。在这个问题中,"生产者"负责创建资源,而"消费者"则负责消费这些资源。为了确保生产者不会在资源耗尽时...

    Java 生产者消费者模式

    总之,生产者消费者模式和中介者设计模式的结合是解决并发问题的一种有效方式,它可以帮助我们构建更加灵活、可维护的系统。通过阅读你提供的`consumption`代码,我们可以深入理解这些概念在实际项目中的应用。

    java 编写的生产者与消费者问题

    在计算机科学中,生产者-消费者问题是多线程并发控制中的一个经典问题。该问题描述了两个并发执行的进程——生产者和消费者,它们共享一个有限大小的缓冲区。生产者进程负责生成数据(消息)并放入缓冲区,而消费者...

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

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

    java实现生产者消费者

    在Java编程中,"生产者消费者"模式是一种典型的多线程问题解决模型,它通过共享资源来协调生产者和消费者之间的操作。这个模式的核心在于如何有效地管理资源的生产和消费,以避免生产过快导致资源浪费,或者消费者...

    java 生产者消费者演示程序

    Java 生产者消费者演示程序 在这个示例程序中,我们可以看到的是生产者消费者模型的实现。该模型描述了一个生产者和一个消费者之间的关系,生产者生产产品,并将其存储在缓冲区中,而消费者则从缓冲区中消费产品。 ...

    生产者消费者模式在java中的应用

    在Java中实现生产者消费者模式,主要依赖于Java提供的并发工具类,如`BlockingQueue`接口以及其实现类,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等。这些队列具有线程安全的特性,能够有效地避免数据竞争和...

    java 多线程生产者消费者模型demo

    Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...

    java生产者与消费者实验报告

    通过本次实验,不仅加深了对Java并发编程的理解,还掌握了如何在多线程环境下实现生产者与消费者模型,确保数据的线程安全和一致性。实验过程中,使用Eclipse IDE搭建开发环境,通过编写和调试代码,成功实现了三个...

    java生产者消费者模型

    Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...

    Java生产者与消费者

    在Java编程中,"生产者与消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的核心思想是通过共享一个有限的缓冲区,使得生产者线程可以将产品放入缓冲区,而消费者线程则可以从缓冲区取出...

    JAVA死锁and生产者消费者问题

    在Java编程中,死锁和生产者消费者问题是多线程编程中的两个重要概念,它们涉及到并发执行和资源管理。理解并正确处理这些问题对于构建高效、可靠的多线程应用至关重要。 死锁是指两个或多个线程在执行过程中,因...

    生产者 消费者 进程 可视化 java

    在Java编程中,"生产者-消费者"模型是一种常见的多线程问题,它涉及到进程...通过图形用户界面,用户可以直观地看到生产者和消费者如何在有限的资源下协同工作,这对于理解和学习并发编程和多线程同步概念非常有帮助。

Global site tag (gtag.js) - Google Analytics