为什么程序在使用 ArrayBlockingQueue 时挂起
why the program hang up when using ArrayBlockingQueue
我在使用 ArrayBlockingQueue
时遇到问题。
这是我的代码:
package study;
import org.pmw.tinylog.Logger;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class App {
public static void main(String[] args) throws Exception {
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(producer).start();
new Thread(consumer).start();
Thread.sleep(1000);
}
}
class Producer implements Runnable {
protected BlockingQueue<String> queue = null;
public Producer(BlockingQueue<String> queue) {
this.queue = queue;
}
@Override
public void run() {
try {
for (int i = 0; i < 100000; i++) {
queue.put(String.valueOf(i));
//Thread.sleep(1000);
}
} catch (InterruptedException e) {
Logger.info(e);
}
}
}
class Consumer implements Runnable {
protected BlockingQueue queue;
public Consumer(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
try {
Logger.info(queue.take());
//Logger.info(queue.take());
//Logger.info(queue.take());
} catch (InterruptedException e) {
Logger.info(e);
}
}
}
但输出是:
2016-10-24 14:08:27 [Thread-1] study.Consumer.run()
INFO: 0
我不认为这是正确的,但我找不到问题。
更改 Consumer
的 运行 循环,因为目前您只是从队列中取出第一个元素,而 Producer
已将 100000 进入队列。
public void run() {
while (true) {
try {
Logger.info(queue.take());
//Logger.info(queue.take());
//Logger.info(queue.take());
} catch (InterruptedException e) {
Logger.info(e);
}
}
}
你运行
Logger.info(queue.take());
只有一次,消费者在从队列中得到一个'0'后退出。只需添加一个 while 循环,例如
while(true) {
Logger.info(queue.take());
}
我在使用 ArrayBlockingQueue
时遇到问题。
这是我的代码:
package study;
import org.pmw.tinylog.Logger;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class App {
public static void main(String[] args) throws Exception {
BlockingQueue<String> queue = new ArrayBlockingQueue<String>(1024);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(producer).start();
new Thread(consumer).start();
Thread.sleep(1000);
}
}
class Producer implements Runnable {
protected BlockingQueue<String> queue = null;
public Producer(BlockingQueue<String> queue) {
this.queue = queue;
}
@Override
public void run() {
try {
for (int i = 0; i < 100000; i++) {
queue.put(String.valueOf(i));
//Thread.sleep(1000);
}
} catch (InterruptedException e) {
Logger.info(e);
}
}
}
class Consumer implements Runnable {
protected BlockingQueue queue;
public Consumer(BlockingQueue queue) {
this.queue = queue;
}
@Override
public void run() {
try {
Logger.info(queue.take());
//Logger.info(queue.take());
//Logger.info(queue.take());
} catch (InterruptedException e) {
Logger.info(e);
}
}
}
但输出是:
2016-10-24 14:08:27 [Thread-1] study.Consumer.run()
INFO: 0
我不认为这是正确的,但我找不到问题。
更改 Consumer
的 运行 循环,因为目前您只是从队列中取出第一个元素,而 Producer
已将 100000 进入队列。
public void run() {
while (true) {
try {
Logger.info(queue.take());
//Logger.info(queue.take());
//Logger.info(queue.take());
} catch (InterruptedException e) {
Logger.info(e);
}
}
}
你运行
Logger.info(queue.take());
只有一次,消费者在从队列中得到一个'0'后退出。只需添加一个 while 循环,例如
while(true) {
Logger.info(queue.take());
}