二小杰 2016-11-11 14:42 采纳率: 0%
浏览 809

为什么只显示生产者线程,不显示消费者线程啊?

/*

  • 描述生产者和消费者问题
  • 1.基本的描述
  • 2.上一步只能执行一次,加入while循环,
  • 3.加入循环后,发现线程不能同步,故加入同步,经过比较,使用同步函数
  • 4.使用同步函数之后,还是没有解决问题,出现只生产不消费的问题
  • 5.加入信号量机制flag,使用wait(),和notify()。在使用wait时,需要使用异常声明
  • 6.还是没法解决问题,查API后引入lock接口 ,使用lock代替同步
  • 7.引入condition */

package lyj.java;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*

  • 描述资源,
  • 包含姓名,数量 等成员属性,
  • 功能:生产
  • 消费 */

class Resource{
//成员属性
private String name;
private int num;
private boolean flag=false;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
//空的构造方法
public Resource(){}
//构造方法
public Resource(String name, int num) {
super();
this.name = name;
this.num = num;
}
//引入lock,并创建对象
Lock lock=new ReentrantLock();
//引入condition
Condition con=lock.newCondition();
Condition pro=lock.newCondition();

//功能1:生产
public  synchronized void set(){
    while(true)
    {   lock.lock();
        if(flag)
        try{con.await();}catch(InterruptedException e){}

        System.out.println(Thread.currentThread().getName()+"---生产---"+num);
        num++;
        pro.signal();
        lock.unlock();
        }

}
//功能2:消费
public  synchronized void out(){
    while(true)
    {   lock.lock();
        if(!flag)
        try{pro.await();}catch(InterruptedException e){}
        System.out.println(Thread.currentThread().getName()+"-----消费------"+num);
        con.signal();
        lock.unlock();
        }   
}

}

/*

  • 描述生产者
    */
    class Producer implements Runnable{
    private Resource r;
    //构造方法
    public Producer(Resource r) {
    this.r=r;
    }
    //复写run方法
    public void run() {
    r.set();

    }

}
/*

  • 描述消费者
    */
    class Consumer implements Runnable{
    private Resource r;
    //构造方法
    public Consumer(Resource r) {
    this.r=r;
    }
    //复写run方法
    public void run() {
    r.out();

    }

}
public class Test8 {

public static void main(String[] args) {

    Resource r=new Resource();
    Producer pro=new Producer(r);
    Consumer con=new Consumer(r);
    Thread t1=new Thread(pro);
    Thread t2=new Thread(con);
    t1.start();
    t2.start(); 
}

}

  • 写回答

1条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波
  • ¥15 针对曲面部件的制孔路径规划,大家有什么思路吗
  • ¥15 钢筋实图交点识别,机器视觉代码
  • ¥15 如何在Linux系统中,但是在window系统上idea里面可以正常运行?(相关搜索:jar包)
  • ¥50 400g qsfp 光模块iphy方案
  • ¥15 两块ADC0804用proteus仿真时,出现异常
  • ¥15 关于风控系统,如何去选择
  • ¥15 这款软件是什么?需要能满足我的需求
  • ¥15 SpringSecurityOauth2登陆前后request不一致