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对象