标签:执行 obj zed override 消费者 锁对象 文章 output 唤醒
import java.util.concurrent.locks.Condition;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();
}
}
/**
*/
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();//开锁
}
}
/**
*/
class Input implements Runnable {
private Resource resource;
public Input(Resource resource) {br/>this.resource=resource;
}
@Override
public void run() {
int x =0;
while(true){
if(x==0){
resource.setInput("张三","男");
}else{
resource.setInput("lili","女");
}
x=(x+1)%2;
}
}
}
/**
*/
class Output implements Runnable {
private Resource resource;
public Output(Resource resource) {br/>this.resource=resource;
}
@Override
public void run() {
while(true){
resource.getOutput();
}
}
}
注意:此次的文章是基于看过上一篇 文章:线程间的通信--等待唤醒机制 的小伙伴的,或者有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