1 生产消费流程系统, 需要用到线程,、
生产者和消费者可以是两个独立的并发主体。,共有四个部分
(一) Q 类, 仓库,有两个方法,1 放入仓库方法,不断得把货物放进仓库,2 出库,不断的把货物从仓库搬出,
(二)Producer ,生产类, 不断调用 仓库 进库方法 put(); 把货物放进仓库;
(三) Comsumer 消费类 三个消费线程, 不断调用 仓库 出库方法 get(); 把货物拿出来 ;
(四) PC类, MAIN 函数, 生成 生产 消费线程,
package com.isoftstone.interview;
public class Q { //仓库,进货,出货,
int n; //库存量
private boolean p=false;
//防死锁 判断,用户 阻塞唤醒消费 生产进程
public synchronized int get(){
while(!p){ //必须put方法 先调用,把P值 设为ture ,然后 三个消费进程 争夺资源
try{
wait();
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"Get!"+n);
p=false;
notifyAll();
//notify();
return n;
}
public synchronized void put(int n)
{
while(p)
try{
wait();
}
catch(InterruptedException e)
{
System.out.println(e.toString());
}
this.n=n;
System.out.println(Thread.currentThread().getName()+"Put!"+n);
p=true; //值为true ,放入了一次货物 通知消费进场 取货,
notifyAll();
//notify();
}
}
package com.isoftstone.interview;
public class Producer implements Runnable {
Q q;
Producer(Q q)
{
this.q=q; //构造器中生成 线程;
new Thread(this,"Producer").start(); //need attention
}
//覆盖 继承下来的run方法
public void run(){
int i=0;
while(true) //生产方法 不断 访问put方法 放货物
{
q.put(i++); //生产物品放入仓库,
}
}
}
package com.isoftstone.interview;
public class Consumer implements Runnable {
Q q;
Consumer(Q q){
this.q=q;
new Thread(this,"消费者1_").start();
new Thread(this,"消费者2_").start();
new Thread(this,"消费者3_").start();
} //覆盖继承run 方法
public void run(){
//因为不止一个用户在 抢占仓库库存 需用互斥 synchronized
synchronized (q){
while(true){
q.get();//消费进程不断取货物,消费,
}
}
}
}
package com.isoftstone.interview;
public class PC {
public static void main(String []args)
{
Q q=new Q();
Thread thread=Thread.currentThread();
new Producer(q);
new Consumer(q);
try{
thread.sleep(10000); //线程 等待10秒,让生产线程 先生产一些产品来
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
|