Почему ExecutorService продолжает выполняться, когда потоки блокируются? - PullRequest
0 голосов
/ 11 июля 2011

Я пытаюсь написать часть многопоточной программы, где каждый поток из фиксированного пула потоков пытается извлечь объект из очереди, и если очередь пуста, поток ожидает.

Проблема, с которой я столкнулсяОпыт показывает, что память, используемая программой, продолжает увеличиваться.

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 продолжает запускаться, когда потоки должны ожидать добавления элемента в очередь.Как мне изменить мой код, чтобы отразить это?

Ответы [ 2 ]

1 голос
/ 11 июля 2011

Добавляет задачи исполнителю так быстро, как только может.

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

Это будет потреблять около 200 МБ в секунду. Это не имеет никакого отношения к тому, есть ли задачи для выполнения или нет.

Если вы не хотите этого делать, я предлагаю вам переместить цикл в runnable и добавить только один. Это заставит его ждать задачи вечно.


Лучше всего использовать встроенную очередь ExecutorService для постановки задач в очередь.

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

executor.shutdown();

Это делает то же самое, но намного проще, ИМХО.

0 голосов
/ 11 июля 2011

это потому, что вы создаете gazillion экземпляров MyHandler и вставляете их во внутреннюю очередь исполнителя.

Этот бесконечный цикл for довольно значителен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...