【发布时间】:2020-01-11 14:56:31
【问题描述】:
我正在尝试了解生产者消费者问题。为了复制这个问题,我编写了以下代码
package com.company;
import java.util.ArrayDeque;
import java.util.Queue;
public class ProducerConsumerProblem {
private static Queue<Integer> q = new ArrayDeque<>(5);
public static void main(String args[]) {
Producer p = new Producer();
Consumer c = new Consumer();
Thread t = new Thread( p );
Thread t1 = new Thread( c );
t.start();
t1.start();
}
public static class Producer implements Runnable {
@Override
public void run() {
while(true) {
if (q.size() == 5) {
continue;
}
System.out.println( "Adding to queue" );
q.add( 1 );
}
}
}
public static class Consumer implements Runnable {
@Override
public void run() {
while(true) {
if (q.size() == 0) {
continue;
}
System.out.println( "Removing from queue" );
q.remove();
}
}
}
}
我期待得到类似concurrent exception 的东西,但是当队列为空或队列已满时,代码会停止。我的问题是为什么当队列为空或已满时代码会停止,因为我将消费者和生产者都置于无限循环中,即使它们同时进行错误读取但在稍后的某个时间点它们会进行良好读取并且生产者或消费者都应该工作.请帮我解决一下情况
【问题讨论】:
-
代码没有停止。两个线程都陷入了无限循环,调用 continue ad infinitum,因为代码不是线程安全的,生产者将 sze 视为 5,而消费者将其视为 0。
标签: java multithreading producer-consumer