簡體   English   中英

為什么 ExecutorService 在線程阻塞時繼續執行?

[英]Why does ExecutorService keep executing when threads are blocking?

我正在嘗試編寫多線程程序的一部分,其中固定線程池中的每個線程都嘗試從隊列中獲取 object,如果隊列為空,則線程等待。

我遇到的問題是程序使用的 memory 不斷增加。

public class Ex3 {

public static LinkedBlockingQueue<Integer> myLBQ = new LinkedBlockingQueue<Integer>(10);

public static void main(String argc[]) throws Exception {
    ExecutorService executor = Executors.newFixedThreadPool(3);
    myLBQ.add(new Integer(1));
    for (;;) {
        executor.execute(new MyHandler(myLBQ));
    }
}
}

class MyHandler implements Runnable {

LinkedBlockingQueue<Integer> myLBQ;

MyHandler(LinkedBlockingQueue<Integer> myLBQ) {
    this.myLBQ = myLBQ;
}

public void run() {
    try {
        myLBQ.take();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
}

我不明白為什么 executor.execute 在線程應該等待將項目添加到隊列時繼續觸發。 如何修改我的代碼以反映這一點?

這會盡可能快地向執行器添加任務。

for (;;) {
    executor.execute(new MyHandler(myLBQ));
}

這將消耗大約 200 MB 每秒。 它與是否有任務要執行沒有任何關系。

如果您不想這樣做,我建議您將循環移動到可運行對象並僅添加一個。 這將導致它永遠等待任務。


更好的方法是使用 ExecutorService 的內置隊列來排隊任務。

ExecutorService executor = Executors.newFixedThreadPool(3);
final int taskId = 1;
executor.submit(new Runnable() {
    @Override
    public void run() {
        doSomething(taskId);
    }
});

executor.shutdown();

這做同樣的事情,但更簡單的恕我直言。

這是因為您正在創建大量 MyHandler 實例並將它們插入到執行程序的內部隊列中。

那個無限的for循環是相當卑鄙的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM