Исправлена ​​ошибка, из которой пул потоков выходил немедленно, не обрабатывая потоки - PullRequest
0 голосов
/ 03 октября 2018

Пытаясь понять фиксированные пулы потоков, я создал этот тестовый код, который показал следующие результаты, вопреки тому, что я думал, что он будет делать:

Thread Start: 1
Thread Start: 2
Thread Start: 0

Вот и все.Никаких сообщений «Конец потока» и только 3 темы были запущены.

Я ожидал и хочу, чтобы все 10 задач были выполнены.

ExecutorService exec = Executors.newFixedThreadPool(3);

for (int c = 0; c < 10; c++) {
    exec.execute(new TestThread(c));
}
exec.shutdown();

public class TestThread implements Runnable {

    private int counter;

    public TestThread (int counter) {
        this.counter = counter;
    }

    @Override
    public void run() {
        System.out.println("Thread Start: " + counter);

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Thread End: " + counter);
    }
}

1 Ответ

0 голосов
/ 03 октября 2018

exec.shutdown() не блокирует основной поток.Если вам нужно дождаться завершения всех представленных задач, вам нужно позвонить exec.awaitTermination(1, TimeUnit.HOUR); (конечно, с учетом времени ожидания, которое имеет смысл для вашего приложения) после вызова exec.shutdown();.

/**
 * Blocks until all tasks have completed execution after a shutdown
 * request, or the timeout occurs, or the current thread is
 * interrupted, whichever happens first.
 */
boolean awaitTermination(long timeout, TimeUnit unit)
    throws InterruptedException;
...