synchronized方式實現生產者-消費者模式
阿新 • • 發佈:2019-01-30
生產者:
public class Producer {
private String lock;
public Producer(String lock){
super();
this.lock = lock;
}
public void setValue(){
try{
synchronized (lock){
if(!ValueObject.value.equals("")){
lock.wait();
}
String value = System.currentTimeMillis() + "_" + System.nanoTime();
ValueObject.value = value;
System.out.println("set:" + value);
lock.notify();
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
消費者:
public class Consumer {
private String lock;
public Consumer(String lock){
super();
this.lock = lock;
}
public void getValue(){
try{
synchronized (lock){
if(ValueObject.value.equals("")){
lock.wait();
}
System.out .println("get:" + ValueObject.value);
ValueObject.value = "";
lock.notify();
}
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
生產者執行緒:
public class ThreadProducer extends Thread {
private Producer producer;
public ThreadProducer(Producer producer){
this.producer = producer;
}
@Override
public void run() {
while (true){
producer.setValue();
}
}
}
消費者執行緒:
public class ThreadConsumer extends Thread {
private Consumer consumer;
public ThreadConsumer(Consumer consumer){
this.consumer = consumer;
}
@Override
public void run() {
while (true){
consumer.getValue();
}
}
}
公共值物件
public class ValueObject {
public static String value = "";
}
啟動類:
public class Run {
public static void main(String[] args) {
String lock = new String("");
Producer p = new Producer(lock);
Consumer c = new Consumer(lock);
ThreadProducer pThread = new ThreadProducer(p);
ThreadConsumer cThread = new ThreadConsumer(c);
pThread.start();
cThread.start();
}
}
執行結果
set:1487991128665_697508406469322
get:1487991128665_697508406469322
set:1487991128665_697508406488082
get:1487991128665_697508406488082
set:1487991128665_697508406506548
get:1487991128665_697508406506548
set:1487991128665_697508406525014
get:1487991128665_697508406525014
set:1487991128665_697508406544066
get:1487991128665_697508406544066