锁定老帖子 主题:java多线程 消费者-生产者
精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-12
java多线程一般都会讲消费者-生产者模型 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-13
做开发一年了 没写过一个线程类
|
|
返回顶楼 | |
发表时间:2010-03-13
不错,不过synchronized 关键字范围过大
|
|
返回顶楼 | |
发表时间:2010-03-13
为什么在consume方法和produce方法开始的时候要调用 this.notifyAll(); 这个应该是生产者在生产完产品后调用通知其他线程,同样消费者在消费完产品后也要调用 this.notifyAll();方法来通知其他线程,为什么一上来调用它呢?
|
|
返回顶楼 | |
发表时间:2010-03-13
p_x1984 写道
java多线程一般都会讲消费者-生产者模型
--------------------------------------------- 除了4和5,其他都不是必要条件.实际上,更多的生产者消费者应用都不遵循1,2,3.
|
|
返回顶楼 | |
发表时间:2010-03-14
asialee 写道 为什么在consume方法和produce方法开始的时候要调用 this.notifyAll(); 这个应该是生产者在生产完产品后调用通知其他线程,同样消费者在消费完产品后也要调用 this.notifyAll();方法来通知其他线程,为什么一上来调用它呢?
楼上有道理,我认为在consume和produce的结尾分别获得producer和consumer的锁,然后notify它们。在方法一开始唤醒不知道有什么意义。 |
|
返回顶楼 | |
发表时间:2010-03-15
看看jdk的BlockQueue
两年前我也自己实现生产消费 后来发现有现成的东西 |
|
返回顶楼 | |
发表时间:2010-03-15
谢谢各位的提醒!
|
|
返回顶楼 | |
发表时间:2010-03-15
问下各位,“ public synchronized void produce(Message message) {”
该方法锁定的资源是“message”还是“queue”? |
|
返回顶楼 | |
发表时间:2010-03-15
下面的是我写的:
import java.util.ArrayList; import java.util.List; public class ProductQueue { private List<Product> products; private int maxSize; public ProductQueue(int maxSize){ this.maxSize = maxSize; products = new ArrayList<Product>(maxSize); } public synchronized void addProdcut(Product product){ while(isFull()){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } products.add(product); System.out.println("Produce:" + product.getId() + " " + product.getMadeDate()); notifyAll(); } public synchronized void removeProduct(){ while(isEmpty()){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } Product product = products.get(products.size() - 1); products.remove(product); System.out.println("Consume:" + product.getId() + " " + product.getMadeDate()); notifyAll(); } public synchronized boolean isFull(){ boolean isFull = products.size() == maxSize; if(isFull){ System.out.println("The queue is full."); } return isFull; } public synchronized boolean isEmpty(){ boolean isEmpty = products.size() <= 0; if(isEmpty){ System.out.println("The queue is empty."); } return isEmpty; } } public class Consumer implements Runnable{ private ProductQueue queue; public Consumer(ProductQueue queue){ this.queue = queue; } @Override public void run() { while(true){ queue.removeProduct(); try { Thread.sleep(100l); } catch (InterruptedException e) { e.printStackTrace(); } } } } import java.util.Date; public class Producer implements Runnable{ private static int id; private ProductQueue queue; public Producer(ProductQueue queue){ this.queue = queue; } @Override public void run() { while(true){ Product product = new Product(id++,new Date()); queue.addProdcut(product); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } import java.util.Date; public class Product { private int id; private Date madeDate; public Product(int id, Date madeDate){ this.id = id; this.madeDate = madeDate; } public int getId() { return id; } public void setId(int id) { this.id = id; } public Date getMadeDate() { return madeDate; } public void setMadeDate(Date madeDate) { this.madeDate = madeDate; } } public class ThreadMain { public static void main(String[] args) { ProductQueue queue = new ProductQueue(50); for(int i = 0; i < 10; i++){ Producer producer = new Producer(queue); new Thread(producer).start(); } for(int i = 0; i < 10; i++){ Consumer consumer = new Consumer(queue); new Thread(consumer).start(); } } } |
|
返回顶楼 | |