第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如果消費者線程遇到異常如何停止生產(chǎn)者線程

如果消費者線程遇到異常如何停止生產(chǎn)者線程

慕的地6264312 2023-09-06 15:48:11
我有這種生產(chǎn)者消費者的情況,我正在使用 arrayblockingqueue。如果消費者線程遇到異常,如何停止生產(chǎn)者線程。我需要生產(chǎn)者停止等待隊列為空。我引發(fā)了強制運行時異常。但程序并沒有退出。生產(chǎn)者一直等待隊列為空。有人可以幫忙嗎public class ServiceClass implements Runnable{    private final static BlockingQueue<Integer> processQueue = new ArrayBlockingQueue<>(10);    private static final int CONSUMER_COUNT = 1;    private boolean isConsumerInterrupted = false;    private boolean isConsumer = false;    private static boolean producerIsDone = false;    public ServiceClass(boolean consumer,boolean isConsumerInterrupted) {        this.isConsumer = consumer;        this.isConsumerInterrupted = isConsumerInterrupted;    }    public static void main(String[] args) {        long startTime = System.nanoTime();        ExecutorService producerPool = Executors.newFixedThreadPool(1);        producerPool.submit(new ServiceClass(false,false)); // run method is                                                         // called           // create a pool of consumer threads to parse the lines read        ExecutorService consumerPool = Executors.newFixedThreadPool(CONSUMER_COUNT);        for (int i = 0; i < CONSUMER_COUNT; i++) {            consumerPool.submit(new ServiceClass(true,false)); // run method is                                                            // called        }        producerPool.shutdown();        consumerPool.shutdown();        while (!producerPool.isTerminated() && !consumerPool.isTerminated()) {        }        long endTime = System.nanoTime();        long elapsedTimeInMillis = TimeUnit.MILLISECONDS.convert((endTime - startTime), TimeUnit.NANOSECONDS);        System.out.println("Total elapsed time: " + elapsedTimeInMillis + " ms");    }    @Override    public void run() {        if (isConsumer) {            consume();        } else {            readFile(); //produce data by reading a file        }    }
查看完整描述

1 回答

?
慕妹3242003

TA貢獻1824條經(jīng)驗 獲得超6個贊

您正在使用標志isConsumerInterrupted來終止生產(chǎn)者線程。這是錯誤的。消費者不會消耗隊列中的元素,而生產(chǎn)者會持續(xù)生產(chǎn)直到隊列已滿,然后開始阻塞,直到隊列未滿。然后,當消費者拋出 RuntimeException 時,它會設置該標志,并且生產(chǎn)者線程沒有機會檢查該標志,因為沒有消費者消耗隊列中的元素,以便生產(chǎn)者可以擺脫等待狀態(tài)。一種選擇是使用 future 并在消費者拋出與設置標志相反的異常時取消它。由于它processQueue.put響應中斷,因此它將成功終止生產(chǎn)者線程。InterruptedException如果在等待期間被中斷,則會拋出An 。它看起來是這樣的。


private static Future<?> producerFuture = null;

public static void main(String[] args) {


    // Remainder omitted.

    producerFuture = producerPool.submit(new ServiceClass(false, false)); 

    // ...

}


private void consume() {

    try {

        // ...

    } catch (Exception e) {

        producerFuture.cancel(true);

    }

}


查看完整回答
反對 回復 2023-09-06
  • 1 回答
  • 0 關(guān)注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號