Несколько ExecutorCompletionService не работает - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть требование запускать и останавливать задачу из Java-приложения. Я пытаюсь использовать ExecutorService для создания потоков и ExecutorCompletionService для проверки статус обработки потока. Запуск и остановка - это постоянное занятие, поэтому по моему Тестовый код Я создал цикл while.

public class ProcessController {

String[] processArray = { "Process1", "Process2", "Process3", "Process4", "Process5", "Process6", "Process7"      };
private List<String> processList = Arrays.asList(processArray);

public static void main(String[] args ) {

    ExecutorService startUpExecutor = Executors.newFixedThreadPool(3);
    ExecutorService cleanUpExecutor = Executors.newFixedThreadPool(3);

    CompletionService<String> startUpCompletionService = new ExecutorCompletionService<>(startUpExecutor);
    CompletionService<String> cleanUpCompletionService = new ExecutorCompletionService<>(cleanUpExecutor);

    List<Future<String>> cleanupFutures = new ArrayList<Future<String>>();
    List<Future<String>> startupFutures = new ArrayList<Future<String>>();

    ProcessController myApp = new ProcessController();

    int i = 0;

    while (i++ < 3) {
        System.out.println("**********Starting Iteration " + i + "************* =====> ");

        if (!cleanupFutures.isEmpty())   cleanupFutures.clear();


        myApp.processList.forEach(process -> cleanupFutures.add(cleanUpCompletionService.submit(new CleanupTask(process))));
        myApp.processList.forEach(process -> startupFutures.add(startUpCompletionService.submit(new StartupTask(process))));


        for (Future<String> f : cleanupFutures) {
            try {
                String result = cleanUpCompletionService.take().get();
                System.out.println("Result from  Cleanup thread : " + result);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }

            for (Future<String> f1 : startupFutures) {
                try {
                    String result = startUpCompletionService.take().get();
                    System.out.println("Result from  startup thread : " + result);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }

            }
            System.out.println("**********Finished Iteration " + i + "************* =====> ");

        }

        startUpExecutor.shutdown();
       cleanUpExecutor.shutdown();
    }
}

Класс CleanupTask

public class CleanupTask implements Callable<String> {
private String task;

public CleanupTask(String task) {
    this.task = task;
}
@Override
public String call() throws Exception {
    checkIfAnyFinished();
    return "finished clean up processing for " + getThreadId();
}

private void checkIfAnyFinished( )
{
    System.out.println( getThreadId() + " Checking if task   " + this.task + " is finished");
    try {
        isFinished();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

private void isFinished() throws InterruptedException {
    Thread.sleep(1000*4);
}

private String getThreadId()
{
    return Thread.currentThread().getName();
}
}

Класс задачи запуска

public class StartupTask implements   Callable<String> {

private String processSchedule ;

public StartupTask(String processSchedule) {
    this.processSchedule = processSchedule;
}

@Override
public String call() {
    scheduleifdue();
    return "finished start up up processing for " + getThreadId();
}

private void scheduleifdue()
{
    System.out.println(getThreadId() + " Checking " + this.processSchedule  + "  is due or not");
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
private String getThreadId()
{
    return Thread.currentThread().getName();
}
}

Над кодом успешно завершите итерацию 1 и запустите 2-ю итерацию. Но это никогда не заканчивается и продолжает работать.

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

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