java 用condition&reentrylock实现生产者消费者
package com.lb;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class test {
private ReentrantLock lock;
private Condition create = null;
private Condition print = null;
private volatile String num = "";
private boolean flag = true;
public static void main(String[] args) {
new test().test2();
}
public test() {
lock = new ReentrantLock();
create = lock.newCondition();
print = lock.newCondition();
}
public void test2() {
Thread conThread = new Thread(new consumer());
Thread creThread = new Thread(new productor());
conThread.start();
creThread.start();
}
class productor implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while (flag) {
lock.lock();
if (num.equals("")) {
String value = String.valueOf(((int) (Math.random() * 10) % 6) + 1);
System.out.println("create value is " + value);
num = value;
print.signalAll();
lock.unlock();
} else {
try {
create.await();
lock.unlock();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class consumer implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while (flag) {
lock.lock();
if (!num.equals("")) {
System.out.println("consumer " + num);
num = "";
create.signalAll();
lock.unlock();
} else {
try {
print.await();
lock.unlock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
更多精彩

