为什么当线程被阻塞时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();
    }
}
}

我不明白为什么遗嘱执行人。当线程应该等待一个项目被添加到Queue中时,execute继续触发。我如何修改我的代码来反映这一点?

这会以最快的速度向执行器添加任务。

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

这将消耗大约200mb每秒。它与是否有任务要执行没有任何关系。

如果你不想这样做,我建议你把循环移到可运行的,只添加一个。这将导致它永远等待任务。


一个更好的方法是使用ExecutorService的内置队列来为任务排队。

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

这个做同样的事情,但要简单得多。

这是因为你创建了大量的MyHandler实例,并将它们插入到执行器的内部队列中。

这个无限的for循环太刻薄了

相关内容

  • 没有找到相关文章

最新更新