黑马程序员技术交流社区
标题:
一个生产者消费者问题的代码分享
[打印本页]
作者:
周博文
时间:
2015-8-15 11:40
标题:
一个生产者消费者问题的代码分享
概述:生产者消费者问题是线程之间通信的经典问题,下面的代码通过wait()和notify()方法实现生产者消费者问题,希望与大家交流。
消费者代码:
import java.util.ArrayList;
public class Consumer implements Runnable {
// 定义一个资源变量
private ArrayList<Object> resources;
// 通过构造方法从外界获取资源对象
public Consumer(ArrayList<Object> resources) {
super();
this.resources = resources;
}
@Override
public void run() {
// 用共享资源当做线程同步锁
synchronized (resources) {
while (true) {
// 如果有资源:集合中有元素
if (resources.size() != 0) {
// 消费资源
Object element = resources.remove(resources.size() - 1);
System.out.println(element + "has been consumed.");
// 唤醒生产者线程
resources.notify();
} else {
// 没有可消费的资源,等待生产者生产
try {
resources.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
复制代码
生产者代码
import java.util.ArrayList;
public class Producer implements Runnable {
// 定义一个资源变量
private ArrayList<Object> resources;
// 通过构造方法从外界获取资源对象
public Producer(ArrayList<Object> resources) {
super();
this.resources = resources;
}
@Override
public void run() {
while (true) {
// 用共享资源当做线程同步锁
synchronized (resources) {
// 如果没有资源:集合中没有元素
if (resources.size() == 0) {
// 生产资源:向集合中添加元素
resources.add("element-" + resources.size());
// 打印提示:新元素已经添加
System.out.println("New element has been produced.");
// 唤醒消费者线程消费已经生产的资源
resources.notify();
} else {
// 如果有资源,等待消费者消费
try {
resources.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
}
}
}
复制代码
测试类代码
import java.util.ArrayList;
public class ThreadDemo {
public static void main(String[] args) {
// 创建资源对象
ArrayList<Object> resources = new ArrayList<Object>();
// 创建生产者消费者对象
Producer p = new Producer(resources);
Consumer c = new Consumer(resources);
// 创建生产者消费者线程
Thread produce = new Thread(p, "producer");
Thread consume = new Thread(c, "consumer");
// 启动线程
produce.start();
consume.start();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2