以下方法是简单的消费者和生产者模型,2个线程实现,如果实现循环模式可自行根据代码改造。实例如下:
public class ConsumerProducerSimple {
public static void main(String[] args) throws Exception {
run();
}
// Condition是JDK1.5新加的,用来取代Object的wait和notify,分别对应await和signal,使用更高效
private final static Lock lock = new ReentrantLock();
private final static Condition condition = lock.newCondition();
private static void run() {
Thread consumer = new Thread(() -> {
System.out.println("consume started...");
try {
lock.lock(); // 获取锁
System.out.println("我在等待一个生产者的信号,休息中!");
condition.await(); // 释放锁,阻塞等待,等到signal信号后唤醒重新获取锁才能继续执行
System.out.println("我接到信号了,消费中..."); // 此时需要生产者释放了所才能继续执行
} catch (InterruptedException ex) {
System.out.println("sleep exception:" + ex.getMessage());
} finally {
System.out.println("consumer release lock!");
lock.unlock();
}
System.out.println("consume stopped!");
});
Thread producer = new Thread(() -> {
System.out.println("produce started...");
try {
Thread.sleep(100); // 保证消费者先拿到锁
lock.lock(); // 获取锁
System.out.println("我拿到锁了,开始生产...");
System.out.println("生产完成,开始通知消费者!");
condition.signalAll(); // 通知所有使用condition.await的线程,signal表示通知第一个,此时还未释放锁
Thread.sleep(4000); // 此时仍占用着锁
System.out.println("通知完成,继续生产...");
} catch (InterruptedException ex) {
ex.printStackTrace();
} finally {
System.out.println("producer release lock!");
lock.unlock();
}
System.out.println("produce stopped!");
});
consumer.start();
producer.start();
}
}