/**
* jdk1.5中提供多线程的升级解决方案,将同步替换成Lock操作
*/
package java160110;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author LiZheng
*
*/
public class ProducerConsumerDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
Resource2 resource = new Resource2();
Producer2 producer = new Producer2(resource);
Consumer2 consumer = new Consumer2(resource);
Thread thread1 = new Thread(producer);
Thread thread2 = new Thread(producer);
Thread thread3 = new Thread(consumer);
Thread thread4 = new Thread(consumer);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
//再次升级
class Resource2 {
private String name;
private int count = 1;
private boolean flag = false;
private Lock lock = new ReentrantLock();
private Condition conditionCon = lock.newCondition();
private Condition conditionPro =lock.newCondition();
// t1 t2
public void set(String name) throws InterruptedException {
lock.lock(); // 上锁
try {
while (flag) {
// condition.await(); // 线程等待
conditionPro.await();
}
// 将if 改成while后发生全部等待的情况
this.name = name + "---" + count++;
System.out.println(Thread.currentThread().getName() + "...生产者..." + this.name);
flag = true;
// condition.signal(); // 唤醒一个
// condition.signalAll();//仍然是唤醒本方
conditionCon.signal();
} finally {
lock.unlock();// 释放锁
}
}
public void out() throws InterruptedException {
lock.lock();
try {
while (!flag) {
conditionCon.await();
}
System.out.println(Thread.currentThread().getName() + "...消费者......." + this.name);
flag = false;
// condition.signal();
// condition.signalAll();
conditionPro.signal();
} finally {
lock.unlock();
}
}
}
class Producer2 implements Runnable {
private Resource2 resource;
public Producer2(Resource2 resource) {
this.resource = resource;
}
@Override
public void run() {
while (true) {
try {
resource.set("+++商品++++");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer2 implements Runnable {
private Resource2 resource;
public Consumer2(Resource2 resource) {
this.resource = resource;
}
@Override
public void run() {
while (true) {
try {
resource.out();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
* jdk1.5中提供多线程的升级解决方案,将同步替换成Lock操作
*/
package java160110;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author LiZheng
*
*/
public class ProducerConsumerDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
Resource2 resource = new Resource2();
Producer2 producer = new Producer2(resource);
Consumer2 consumer = new Consumer2(resource);
Thread thread1 = new Thread(producer);
Thread thread2 = new Thread(producer);
Thread thread3 = new Thread(consumer);
Thread thread4 = new Thread(consumer);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
//再次升级
class Resource2 {
private String name;
private int count = 1;
private boolean flag = false;
private Lock lock = new ReentrantLock();
private Condition conditionCon = lock.newCondition();
private Condition conditionPro =lock.newCondition();
// t1 t2
public void set(String name) throws InterruptedException {
lock.lock(); // 上锁
try {
while (flag) {
// condition.await(); // 线程等待
conditionPro.await();
}
// 将if 改成while后发生全部等待的情况
this.name = name + "---" + count++;
System.out.println(Thread.currentThread().getName() + "...生产者..." + this.name);
flag = true;
// condition.signal(); // 唤醒一个
// condition.signalAll();//仍然是唤醒本方
conditionCon.signal();
} finally {
lock.unlock();// 释放锁
}
}
public void out() throws InterruptedException {
lock.lock();
try {
while (!flag) {
conditionCon.await();
}
System.out.println(Thread.currentThread().getName() + "...消费者......." + this.name);
flag = false;
// condition.signal();
// condition.signalAll();
conditionPro.signal();
} finally {
lock.unlock();
}
}
}
class Producer2 implements Runnable {
private Resource2 resource;
public Producer2(Resource2 resource) {
this.resource = resource;
}
@Override
public void run() {
while (true) {
try {
resource.set("+++商品++++");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer2 implements Runnable {
private Resource2 resource;
public Consumer2(Resource2 resource) {
this.resource = resource;
}
@Override
public void run() {
while (true) {
try {
resource.out();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}