多线程--简单生产者与消费者(Lock锁)

前两篇的生产者与消费者(多线程)运用的是synchronized进行同步锁的,本次将运用JDK1.5提供的Lock锁。

它 将synchronized替换成了Lock将Object中的wait notify notifyAll替换成了Condition对象,

Condition可以被Lock获取,

可以创建多个Condition对象,只唤醒对方操作。

具体代码如下:

package cn.zz;

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

class Resource3 {
private String name;
private int count;
private boolean flag = false;
private Lock lock = new ReentrantLock();
Condition condition_Pro = lock.newCondition();
Condition condition_Con = lock.newCondition();

public void set(String name) throws Exception {
lock.lock();
try {
while (flag) {
condition_Pro.await();
this.name = name + "..." + count++;
System.out.println(Thread.currentThread().getName() + "...生产者"
+ this.name);
flag = true;
}
} finally {
condition_Con.signal();
}
}

public void out() throws Exception {
lock.lock();
try {
while (!flag) {
condition_Pro.await();
this.name = name + "..." + count++;
System.out.println(Thread.currentThread().getName()
+ "...消费者....." + this.name);
flag = false;
}
} finally {
condition_Pro.signal();
}

}

class Producer3 implements Runnable {
Resource3 res3;

public Producer3(Resource3 res3) {
this.res3 = res3;
}

@Override
public void run() {
while (true) {
try {
res3.set("商品");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

}

class Consumer3 implements Runnable {
Resource3 res3;

public Consumer3(Resource3 res3) {
this.res3 = res3;
}

@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
res3.out();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

public class ProducerAndConsumer3 {
public void main(String[] args) {
Resource2 res2 = new Resource2();

new Thread(new Producer2(res2)).start();
new Thread(new Producer2(res2)).start();
new Thread(new Consumer2(res2)).start();
new Thread(new Consumer2(res2)).start();

}
}
}

运行结果如上。

猜你喜欢

转载自www.cnblogs.com/twqwe/p/9749927.html