Как запланировать одновременные Runnables в соответствии с количеством потоков, в то время как поток должен ждать задержку после завершения задачи - PullRequest
0 голосов
/ 29 марта 2019

Я планирую задачи с определенной задержкой для обработки моих предметов:

while (currentPosition < count) {
    ExtractItemsProcessor extractItemsProcessor = 
        getExtractItemsProcessor(currentPosition, currentPositionLogger);
    executor.schedule(extractItemsProcessor, waitBetweenProzesses, TimeUnit.SECONDS);
    waitBetweenProzesses += sleepTime;
    currentPosition += chunkSize;
}

Как я могу запланировать, например, 3 задачи (с исполнителем из 3 потоков), и каждый поток должен ждать 10 секундпосле того, как он закончил свою задачу?

1 Ответ

1 голос
/ 29 марта 2019

Вы можете использовать Executors.newFixedThreadPool (NB_THREADS) , который возвращает ExecutorService. Затем с помощью этого executorService вы можете отправить задание. Пример:

private static final int NB_THREADS = 3;

public static void main(String[] args) {

    ExecutorService executorService = Executors.newFixedThreadPool(NB_THREADS);

    for (int i = 0; i < NB_THREADS; i++) {
        final int nb = i + 1;
        Runnable task = new Runnable() {
            public void run() {
                System.out.println("Task " + nb);
                try {
                    TimeUnit.SECONDS.sleep(10);
                    System.out.println("Task " + nb + " terminated");
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    System.out.println("Error during thread await " + e); // Logging framework should be here
                }
            }
        };

        executorService.submit(task);
    }


    executorService.shutdown();
    try {
        executorService.awaitTermination(1, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
        System.out.println("Error during thread await " + e);
    }
}

Он будет запускать 3 задачи параллельно, и результат будет выглядеть следующим образом:

Task 1
Task 3
Task 2
Task1 terminated
Task2 terminated
Task3 terminated

В вашем случае вы могли бы сделать что-то вроде:

ExecutorService executorService = Executors.newFixedThreadPool(NB_THREADS);
while (currentPosition < count) {
    ExtractItemsProcessor extractItemsProcessor =
            getExtractItemsProcessor(currentPosition, currentPositionLogger);
    executorService.submit(extractItemsProcessor); // In processor you should add the sleep method
    waitBetweenProzesses += sleepTime;
    currentPosition += chunkSize;
}
...