我正在嘗試編寫多線程程序的一部分,其中來自固定線程池的每個線程都嘗試從隊列中獲取對象,並且如果隊列爲空,線程將等待。爲什麼ExecutorService在線程被阻塞時保持執行狀態?
我遇到的問題是程序使用的內存不斷增加。
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會持續觸發。如何修改我的代碼以反映這一點?
謝謝,我沒有意識到,無論線程是否可用來執行它們,項目都會被添加到隊列中。 – Mat
您可以更改它以拒絕任務,並且沒有等待線程,但這通常會導致「RejectedExecutionException」,這不是您想要的。 –