码迷,mamicode.com
首页 > 其他好文 > 详细

生产者消费者

时间:2018-01-31 14:43:42      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:执行   obj   zed   override   消费者   锁对象   文章   output   唤醒   

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

public class Test {
public static void main(String[] args) {
Resource r = new Resource();
Input input = new Input(r);
Output output = new Output(r);
new Thread(input).start();
new Thread(input).start();
new Thread(output).start();
new Thread(output).start();
}
}
/**

  • 两个线程共同的资源
  • @author WangShuang
  • */
    class Resource{
    private String name;
    private String sex;
    private int count;
    private boolean flag;//添加一个标记用来表示Resource中的资源是否为空(Input以后代表存入不为空,Output以后代表取出为空)
    Lock lock = new ReentrantLock();
    Condition condition_input = lock.newCondition();
    Condition condition_output = lock.newCondition();
    public String getOutput() {
    lock.lock();//上锁
    while(flag){//如果flag是真,代码资源库中的资源还没有被取走,此时该线程应该放弃cpu的执行权,并把另一个线程叫醒
    try {condition_input.await();} catch (InterruptedException e) {e.printStackTrace();}
    }
    System.out.println(Thread.currentThread().getName()+"消费了一个"+sex+"---------------"+name);
    flag=true;
    condition_output.signal();
    lock.unlock();//开锁
    return name+"---"+sex;

    }
    public void setInput(String name,String sex) {
    lock.lock();//上锁
    while(!flag){//如果flag是假,代码资源库中的资源已经被取走,此时该线程应该放弃cpu的执行权,并把另一个线程叫醒
    try {condition_output.await();} catch (InterruptedException e) {e.printStackTrace();}
    }
    this.name = name+count++;
    this.sex = sex;
    System.out.println(Thread.currentThread().getName()+"生产了一个"+this.sex+"---"+this.name);
    flag=false;
    condition_input.signal();
    lock.unlock();//开锁
    }

}
/**

注意:此次的文章是基于看过上一篇 文章:线程间的通信--等待唤醒机制 的小伙伴的,或者有java基础的人看的,在或者。。。,

说明:Lock对象时在jdk1.5以后才有的,jdk1.5大概是2007年出来的,Lock对象可以替换之前的synchronized语句,Condition是代替Object中的wait notify方法的

为什么之前这些操作线程的方法,wait notify要放在object中呢?
同步代码的锁对象可以是任意对象

Lock对象,出现的原因
因为jdk1.4之前唤醒的是所以得线程,包括生产者和消费者的,这样效率很低,我们需要的是唤醒对方线程中的一个,所以出现了Lock对象

生产者消费者

标签:执行   obj   zed   override   消费者   锁对象   文章   output   唤醒   

原文地址:http://blog.51cto.com/13579086/2067246

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!