Многопоточность Java ждет завершения задачи - PullRequest
0 голосов
/ 25 сентября 2018

Я бы хотел попросить вас помочь с этим кодом.У меня есть 10 экземпляров GameGeneratorController.Каждый экземпляр использует метод StartTaskCalculation (), который я хотел бы создать максимум 3 задачи (для типа 1-2-3).Затем метод AddTask добавляет задачу исполнителю, который может обрабатывать 4 потока одновременно.

И проблема: мне нужно проверить, какой расчет был отправлен исполнителю.Например, когда я вызываю AddTask (1), я хочу дождаться завершения вычисления (1) и только затем снова вызвать AddTask (1).

Теперь я могу вызывать StartTaskCalculation () 100 раз подряд, и к исполнителю будет добавлено 100 задач.

Я бы хотел, чтобы в исполнителе было максимум 30 задач (10GameControllers * 3 задачи)в то же время.Я пытался использовать Future.get () для получения результата, но это заблокирует другие потоки.

Мне нужно, чтобы эти 4 потока работали одновременно, и когда один из них будет завершен, дайте мне обратный вызов и дайте мне знать:«Для этого GameGeneratorController это вычисление (1) выполнено»

public class Main {   
     static ExecutorService executor = Executors.newFixedThreadPool(4);      

     public static void main(String[] args) {

     GameGeneratorControllers[] controllers;
     for(1 to 10)   {
     controllers.add(new GameGeneratorControllers)
                    }
}



public class GameGeneratorController {

    public GameGeneratorController(int gameId, ExecutorService executor  )
    {
        this.gameId = gameId;      
        this.executor = executor;
    }
    ExecutorService executor;
    int gameId;


    public void StartTaskCalculation(){
        int Type = some logic to pick up from 1 , 2 or 3
        AddTask(Type);
    }

     public void AddTask(int taskType)
    {
        executor.execute(Calculation(int taskType));
    }

    void Calculation(int i){
        //some calculation here
    }   
}

1 Ответ

0 голосов
/ 25 сентября 2018

У вас уже есть ExecutorService.Это большое преимущество, потому что

Исполнитель, который предоставляет методы для управления завершением и методы, которые могут создать Future для отслеживания хода выполнения одной или нескольких асинхронных задач.

Из Java-документов

В будущем вы можете сделать

Методы для проверки завершения вычислений, для ожидания егозавершение, и получить результат вычисления.Результат можно получить только с помощью метода get после завершения вычисления, при необходимости блокируя до его готовности.

Из JavaDocs

С этим вы можетесделал что хочешь.Я надеюсь, что это поможет вам, вы можете найти много уроков по этому поводу.

...