#粤嵌星计划,粤嵌我来了#
#粤嵌星计划,粤嵌我来了#
核心思想:
(1)生产者是一个线程--生产者负责生产商品。
(2)消费者是另外一线程---负责消费商品。
(3)不能生产过剩,也就是生产者生产一个商品,消费者消费一个。
思路:严格遵循生产者生产一个商品,消费者消费一个。
也就是当生产者生产一个商品后,则将自己等待(调用wait()函数),等待的同时需要唤醒消费者(调用notify()函数),完成消费,消费者完成消费后,需要等待,同时需要通知生产者生产商品。
案例:
Info类(模拟生产消费过程):
public class Info {
private String name = "生产者:"; // 信息名称,指定默认值
private String content = "我生产OK"; // 信息内容,指定默认值
private boolean flag = false; // 设置标志位
public String getName() { // 取得信息名称
return name; // 返回信息名称
}
public void setName(String name) { // 设置信息名称
this.name = name; // 设置name属性内容
}
public String getContent() { // 取得信息内容
return content; // 返回信息内容
}
public void setContent(String content) { // 设置信息内容
this.content = content; // 设置content属性内容
}
public synchronized void set(String name, String content) { // 设置信息名称及内容
try {
if (!flag) { // 标志位为false,不可以生产
this.wait(); // 等待消费者取走,处理异常
}
this.setName(name); // 设置信息名称
this.setContent(content); // 设置信息内容
flag = false; // 修改标志位,表示可以取走
this.notify();
} catch (Exception e) {
// TODO: handle exception
} // 唤醒等待线程
}
public synchronized void get() { // 取得信息内容
try {
if (flag) { // 标志位为true,不可以取走
this.wait(); // 等待生产者生产,处理异常
}
Thread.sleep(600); // 加入延迟,处理异常
System.out.println(this.getName() + " --> " + this.getContent()); // 输出信息
flag = true; // 修改标志位为true,表示可以生产
this.notify(); // 唤醒等待线程
} catch (Exception e) {
// TODO: handle exception
}
}
}
Producer生产者类:
public class Producer implements Runnable {
private Info info = null; // 保存Info引用
public Producer(Info info) { // 通过构造方法设置Info属性内容
this.info = info; // 为info属性初始化
}
public void run() { // 覆写run()方法
boolean flag = false; // 定义标记位
while(true){
if (flag) { // 如果为true,则设置第一个信息
this.info.set("生产者:", "我生产OK"); // 设置信息
flag = false; // 修改标记位
} else { // 如果为false,则设置第二个信息
this.info.set("消费者:", "我消费完成"); // 设置信息
flag = true; // 修改标记位
}
}
}
}
Consumer消费者类:
public class Consumer implements Runnable {
private Info info = null; // 保存Info引用
public Consumer(Info info) { // 通过构造方法设置Info属性内容
this.info = info; // 为info属性初始化
}
public void run() { // 覆写run()方法
while(true){
try {
Thread.sleep(100); // 加入延迟
} catch (InterruptedException e) {
e.printStackTrace();
}
this.info.get(); // 取出信息
}
}
}
Demo测试类:
public class Demo {
public static void main(String[] args) {
Info i = new Info(); // 实例化Info对象
Producer pro = new Producer(i); // 实例化生产者,传递Info引用
Consumer con = new Consumer(i); // 实例化消费者,传递Info引用
new Thread(con).start(); // 启动消费者线程
new Thread(pro).start(); // 启动生产者线程
}
}