一、wait() 和 notify实现
生产者:
public class Producter implements Runnable {
private List<Long> list;
public Producter(List<Long> list) {
this.list = list;
}
@Override
public void run() {
while (true) {
synchronized (list) {
while(list.size() == 10) {
try {
System.out.println(Thread.currentThread() + ", 生产的真快,容器满了");
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//空闲则生成元素,并通知消费者线程
Long nano = System.nanoTime();
System.out.println("生产" + nano);
list.add(nano);
list.notifyAll();
}
}
}
}
消费者:
public class Consumer implements Runnable {
private List<Long> list;
public Consumer(List<Long> list) {
this.list = list;
}
@Override
public void run() {
while (true) {
synchronized (list) {
if(list.size() == 0) {
try {
System.out.println(Thread.currentThread() + ", 消费完了等着生产吧");
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("容器容量:"+list.size());
System.out.println("消费:"+list.get(0));
list.remove(0);
list.notifyAll();
}
}
}
}
测试类:
public class ThreadTest {
public static void main(String[] args) {
List<Long> list = new ArrayList<>();
Thread producterThread = new Thread(new Producter(list));
Thread consumerThread = new Thread(new Consumer(list));
producterThread.start();
consumerThread.start();
}
}
测试结果:
生产247378745518117
生产247378746100577
生产247378746174133
生产247378746226306
生产247378746273348
生产247378746313119
生产247378746357595
生产247378746396511
生产247378746440987
生产247378746485890
Thread[Thread-0,5,main], 生产的真快,容器满了
容器容量:10
消费:247378745518117
容器容量:9
消费:247378746100577
生产247380752706064
生产247380752756954
Thread[Thread-0,5,main], 生产的真快,容器满了
容器容量:10
消费:247378746174133
生产247381753013544
Thread[Thread-0,5,main], 生产的真快,容器满了
容器容量:10
消费:247378746226306
容器容量:9
消费:247378746273348
容器容量:8
消费:247378746313119
容器容量:7
消费:247378746357595
容器容量:6
消费:247378746396511
容器容量:5
消费:247378746440987
生产247387755935679
生产247387756011373
生产247387756063974
生产247387756103318
生产247387756131543
生产247387756158913
Thread[Thread-0,5,main], 生产的真快,容器满了
容器容量:10
消费:247378746485890
容器容量:9
消费:247380752706064
容器容量:8
消费:247380752756954
容器容量:7
消费:247381753013544
生产247391756681929
生产247391756724694
生产247391756752064
生产247391756790552
Thread[Thread-0,5,main], 生产的真快,容器满了
容器容量:10
消费:247387755935679
容器容量:9
消费:247387756011373
容器容量:8
消费:247387756063974
容器容量:7
消费:247387756103318
容器容量:6
消费:247387756131543
容器容量:5
消费:247387756158913
容器容量:4
消费:247391756681929
生产247398757959748
生产247398757987973
生产247398758012777
生产247398758033732
生产247398758078207
生产247398758108571
生产247398758219760
Thread[Thread-0,5,main], 生产的真快,容器满了
容器容量:10
消费:247391756724694
容器容量:9
消费:247391756752064
容器容量:8