我正在学习Executor服务并尝试使用Executor Service创建生产者 - 消费者场景。 我已经使用run方法定义了producer和consumer,它一直运行直到标志“isStopped”没有设置为false。
我的Producer类运行方法如下
@Override
public void run() {
while(!isStopped){
MyTask task = new MyTask();
System.out.println("I am thread "+this+" entering task "+ task);
try {
myBlockingQueue.addTask(task);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
消费者看起来
@Override
public void run() {
while(!isStopped){
System.out.println("I am thread "+this);
try {
MyTask task = myBlockingQueue.removeTask();
System.out.println("I am thread "+this+" retrieved task "+ task);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
两者都有将标志设置为
的方法public void stopThread(){
isStopped=true;
this.interrupt();
}
我创建了2个生产者和1个消费者,如下所示
public class MyExecutorTester {
public static void main(String[] args) throws InterruptedException, ExecutionException {
MyBlockingQueue mbq = new MyBlockingQueue(5);
ExecutorService es = Executors.newFixedThreadPool(4);
MyProducerThread p1 = new MyProducerThread(mbq);
MyProducerThread p2 = new MyProducerThread(mbq);
MyConsumerThread c1 = new MyConsumerThread(mbq);
es.execute(p1);
es.execute(p2);
es.execute(c1);
es.shutdownNow();
p1.stopThread();
p2.stopThread();
c1.stopThread();
}
}
虽然调用了es.shutdownNow(),但生产者和消费者仍在继续运行。 我必须明确调用stopThread。在这种情况下,生产者会停止,但是正在等待队列的消费者有任务重新捕获。
现在我的问题是
1)为什么shutdownNow()没有停止所有线程
2)如果我需要自己调用stop方法; ExecutorServices的优点是什么
3)您能否指出使用Exeutor更好地实施生产者 - 消费者;生产者和生产者消费者继续运行直到停止
修改 根据下面的注释,我在run()方法中处理了interruptedException,如下所示
@Override
public void run() {
while(!isStopped ){
System.out.println("I am thread "+this);
try {
MyTask task = myBlockingQueue.removeTask();
System.out.println("I am thread "+this+" retrieved task "+ task);
} catch (InterruptedException e) {
isStopped=true;
}
}
}
和
@Override
public void run() {
while(!isStopped){
MyTask task = new MyTask();
System.out.println("I am thread "+this+" entering task "+ task);
try {
myBlockingQueue.addTask(task);
} catch (InterruptedException e) {
isStopped=true;
}
}
}
现在我不需要调用stopThread()方法。调用es.shutdownNow()会中断每个线程。我将标志设置为true。因此所有线程都停止了。
public static void main(String[] args) throws InterruptedException, ExecutionException {
MyBlockingQueue mbq = new MyBlockingQueue(5);
ExecutorService es = Executors.newFixedThreadPool(4);
MyProducerThread p1 = new MyProducerThread(mbq);
MyProducerThread p2 = new MyProducerThread(mbq);
MyConsumerThread c1 = new MyConsumerThread(mbq);
es.execute(p1);
es.execute(p2);
es.execute(c1);
es.shutdownNow();
}