首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

生产者消费者有关问题 Thread

2012-12-25 
生产者消费者问题 Thread前段时间又回头看了看java基础的线程问题,感觉就是不一样;容易得多,当初第一次真

生产者消费者问题 Thread
    前段时间又回头看了看java基础的线程问题,感觉就是不一样;
容易得多,当初第一次真的搞晕人;
     顺便试了一下,多生产者消费者的同步通信问题:
              由生产者,消费者,仓库 三部分组成Product的处理
贴出来,交流一下。

package package com.pdsu.zhang.thread;import java.util.LinkedList;import java.util.Queue;class Product { //产品private int ID;private String name;public Product(int id, String name) {ID = id;this.name = name;}@Overridepublic String toString() {return  "["+ID+"--"+name+"]";}}class Store {//仓库private final int MAX=10;private int flag=-1;Queue<Product> list =new LinkedList<Product>();// 队列private int id=0;Product temp;synchronized void add(){if(judge()==1){System.out.println("生产者 "+Thread.currentThread().getName()+" :仓库已满,请稍后生产.....");try {this.wait();//Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}else{temp=new Product(++id,"产品");if(judge()==-1){list.offer(temp);this.notify();}elselist.offer(temp);System.out.println(Thread.currentThread().getName()+" 生产入仓库:"+temp.toString());//  不放在run{}中,否则会:先打印消费后生产!  因为print和add没有被同步;try {//  等会儿再生产,模拟生产耗时Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}}synchronized void get(){if(judge()==-1){System.out.println("消费者 "+Thread.currentThread().getName()+" :仓库无货,请稍后再来.....");try {this.wait();//Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}else{if(judge()==1){temp = list.poll();this.notify();// 不通知就会死等,死锁了}elsetemp = list.poll();System.out.println(Thread.currentThread().getName()+" 消费了产品:"+temp.toString());//    不放在run{}中,同上:try {//  等会儿再消费,模拟消费耗时Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}}// 判断仓库的库存量synchronized int judge(){if(list.size()>=MAX) flag=1;else if(list.isEmpty()) flag=-1;else flag=0;return flag;}}class Producer implements Runnable {//生产者Store s;public Producer(Store s) {this.s = s;}public void run() {while(true){s.add();}}}class Customer implements Runnable{//消费者Store s;public Customer(Store s) {this.s = s;}public void run() {while(true){s.get();}}}public class Producer_Customer {/** * @param args * @author zhangli */public static void main(String[] args) {Store s = new Store();Producer p= new Producer(s);Customer c= new Customer(s);Producer p1= new Producer(s);Customer c1= new Customer(s);Producer p2= new Producer(s);Customer c2= new Customer(s);new Thread(p,"p0").start();new Thread(c,"c0").start();new Thread(p1,"p1").start();new Thread(c1,"c1").start();new Thread(p2,"p2").start();new Thread(c2,"c2").start();}}


测试了一下,还不错,控制的还好吧;
测试结果如下:

p0 生产入仓库:[1--产品]
c2 消费了产品:[1--产品]
消费者 c2 :仓库无货,请稍后再来.....
消费者 c1 :仓库无货,请稍后再来.....
p2 生产入仓库:[2--产品]
p1 生产入仓库:[3--产品]
p1 生产入仓库:[4--产品]
c0 消费了产品:[2--产品]
p1 生产入仓库:[5--产品]
p1 生产入仓库:[6--产品]
p1 生产入仓库:[7--产品]
p2 生产入仓库:[8--产品]
p2 生产入仓库:[9--产品]
p2 生产入仓库:[10--产品]
p2 生产入仓库:[11--产品]
c2 消费了产品:[3--产品]
p0 生产入仓库:[12--产品]
p0 生产入仓库:[13--产品]
生产者 p0 :仓库已满,请稍后生产.....
c2 消费了产品:[4--产品]
p2 生产入仓库:[14--产品]
生产者 p1 :仓库已满,请稍后生产.....
c0 消费了产品:[5--产品]
c0 消费了产品:[6--产品]
c0 消费了产品:[7--产品]

相互制约的线程控制是什么概念。。没听说过

热点排行