使用ReentrantLock实现生产者消费者模式
使用ReentrantLock实现生产者消费者模式
一. 生产者/消费者模式:一对一交替打印
新建MyService.java :
package service;
importjava.util.concurrent.locks.Condition;
importjava.util.concurrent.locks.ReentrantLock;
public class MyService {
privateReentrantLock lock = new ReentrantLock();
privateCondition condition = lock.newCondition();
privateboolean hasValue = false;
publicvoid set() {
try{
lock.lock();
while(hasValue == true) {
condition.await();
}
System.out.println("打印★");
hasValue= true;
condition.signal();
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
publicvoid get() {
try{
lock.lock();
while(hasValue == false) {
condition.await();
}
System.out.println("打印☆");
hasValue= false;
condition.signal();
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
新建MyThreadA.java :
package extthread;
import service.MyService;
public class MyThreadA extends Thread {
privateMyService myService;
publicMyThreadA(MyService myService) {
super();
this.myService= myService;
}
@Override
publicvoid run() {
for(int i = 0; i < Integer.MAX_VALUE; i++) {
myService.set();
}
}
}
新建MyThreadB.java :
package extthread;
import service.MyService;
public class MyThreadB extends Thread {
privateMyService myService;
publicMyThreadB(MyService myService) {
super();
this.myService= myService;
}
@Override
publicvoid run() {
for(int i = 0; i < Integer.MAX_VALUE; i++) {
myService.get();
}
}
}
新建Run.java :
package test;
import service.MyService;
import extthread.MyThreadA;
import extthread.MyThreadB;
public class Run {
publicstatic void main(String[] args) throws InterruptedException {
MyServicemyService = new MyService();
MyThreadAa = new MyThreadA(myService);
a.start();
MyThreadBb = new MyThreadB(myService);
b.start();
}
}
运行结果如下:
二. 生产者/消费者模式:多对多交替打印
新建类MyService.jave:
package service;
importjava.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class MyService {
privateReentrantLock lock = new ReentrantLock();
privateCondition condition = lock.newCondition();
privateboolean hasValue = false;
publicvoid set() {
try{
lock.lock();
while(hasValue == true) {
System.out.println("有可能★★连续");
condition.await();
}
System.out.println("打印★");
hasValue= true;
// 注意:如果signall() 会出现假死情况
condition.signalAll();
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
publicvoid get() {
try{
lock.lock();
while(hasValue == false) {
System.out.println("有可能☆☆连续");
condition.await();
}
System.out.println("打印☆");
hasValue= false;
condition.signalAll();
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
2个线程类和上面一样。
新建Run.java :
package test;
import service.MyService;
import extthread.MyThreadA;
import extthread.MyThreadB;
public class Run {
publicstatic void main(String[] args) throws InterruptedException {
MyServiceservice = new MyService();
MyThreadA[]threadA = new MyThreadA[10];
MyThreadB[]threadB = new MyThreadB[10];
for(int i = 0; i < 10; i++) {
threadA[i]= new MyThreadA(service);
threadB[i]= new MyThreadB(service);
threadA[i].start();
threadB[i].start();
}
}
}
运行结果如下: