java - 为什么当线程阻塞时 ExecutorService 仍继续执行?

标签 java multithreading 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 不断触发。如何修改我的代码以反射(reflect)这一点?

最佳答案

这会尽快将任务添加到执行器。

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();

这做同样的事情,但恕我直言,更简单。

关于java - 为什么当线程阻塞时 ExecutorService 仍继续执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6652260/

相关文章:

java - 用 Java 计算您的出生日期

c - 使用信号量进行线程同步

java - 如果未调用 notify(),等待线程会发生什么情况?

java - 在 Java 7 中并行处理结果,使用非最终变量

java - 增加 Executors.newFixedThreadPool() 中的线程数会减慢速度

Java Swing定时器如何使用

java - 将函数引用作为参数传递

java - 在 Websocket session 中访问 UserAgent?

java - 在 Spring Batch 中动态设置 gridSize(线程数)

通过执行器重用java线程