[英]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.