生产者 - 消费者使用Executor服务

时间:2017-05-10 15:37:36

标签: java multithreading threadpool executorservice

我正在学习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();


}

0 个答案:

没有答案