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();//开锁
}
} /**
- 存资源的线程
- @author WangShuang
/ class Input implements Runnable { private Resource resource; public Input(Resource resource) { 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; } } } /* *
- @author 取资源的线程
*/ class Output implements Runnable { private Resource resource; public Output(Resource resource) { 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对象