Java 多线程编程 生产者 消费者模式
1. 消息类
- 消息数超过存放最大数, 则生产者线程阻塞(等待消费者消费后唤醒)
- 消息数等于空, 则消费者线程阻塞(等待生产者生产后唤醒)
public class Message {
/** 当前消息数量*/
private int count = 0;
/** 信息存放最大限数*/
private int maximum = 20;
/**
* 生产消息
* */
public synchronized void set() {
if (count <= maximum) {
/** 生产一个消息*/
System.out.println("生产者 线程" + Thread.currentThread().getName() + "生产了一个消息, 当前有" + (++count) + "个消息");
/** 通知等待的消费者*/
super.notify();
} else {
try {
/**
* 如果当前消息大于 maximum信息最大数
* 生产者进入睡眠/等待状态
* */
super.wait();
System.out.println("生产者 线程" + Thread.currentThread().getName() + "进入睡眠");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 消费消息
* */
public synchronized void get() {
if (count > 0) {
/** 消费一个消息*/
System.out.println("消费者 线程" + Thread.currentThread().getName() + "消费了一个消息, 当前有" + (--count) + "个消息");
/** 通知等待的生产者*/
super.notify();
} else {
try {
/** 如果没有消息, 消费者进入睡眠/等待状态*/
super.wait();
System.out.println("消费者 线程" + Thread.currentThread().getName() + "进入睡眠");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2. 生产者类
public class Producer implements Runnable {
private Message message;
public Producer(Message message) {
this.message = message;
}
@Override
public void run() {
while(true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
message.set();
}
}
}
3. 消费者类
public class Consumer implements Runnable {
private Message message;
public Consumer(Message message) {
this.message = message;
}
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
message.get();
}
}
}
Runnable是接口, Thread是 Runnable的实现类, 由于 Java对多接口实现比较灵活, 开发多线程时建议实现 Runnable接口. 启动时用 Thread的 start(). 例: new Thread().start()
4. App.java
public class App {
public static void main(String[] args) {
final Message message = new Message();
/** 建几个生产线程*/
new Thread(new Producer(message)).start();
new Thread(new Producer(message)).start();
new Thread(new Producer(message)).start();
/** 建几个消费线程*/
new Thread(new Consumer(message)).start();
new Thread(new Consumer(message)).start();
new Thread(new Consumer(message)).start();
new Thread(new Consumer(message)).start();
}
}
如果您觉得有帮助,欢迎点赞哦 ~ 谢谢!!