示例代码
package test;
import java.io.IOException;
import java.util.*;
/**
* @Description TODO
* @Author linmingxing
* @Date 2020/3/5 下午11:52
**/
public class Test {
public static void main(String[] args) throws IOException, InterruptedException {
List list = new ArrayList();
Producer producer = new Producer(list);
Consumer consumer = new Consumer(list);
new Thread(producer).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
new Thread(consumer).start();
}
}
class Producer implements Runnable {
List list;
public Producer(List list) {
this.list = list;
}
@Override
public void run() {
while (true){
synchronized (list) {
while (list.size() == 3) {
//等待消费者消费
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//即将生产出来的元素
int prod = list.size() + 1;
//生产元素
list.add(prod);
System.out.println("生产出===>" + prod);
//因为之前列表中的元素为空,所以消费者线程正在等待,所以需要手动唤醒消费者线程
list.notify();
}
try {
//让出当前线程的执行权,是线程处于就绪状态
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
List list;
public Consumer(List list) {
this.list = list;
}
@Override
public void run() {
while (true){
synchronized (list) {
while (list.size() == 0) {
//暂时没有元素可消费,使线程等待
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消费掉===>" + list.remove(0));
//唤醒正在等待的生产者线程
list.notify();
}
try {
//让出当前线程的执行权,是线程处于就绪状态
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}