У меня есть несколько таких задач:
public static String task1()
public static String task2()
public static String task3()
public static String task4()
public static String task5()
public static String task6()
Я хочу выполнить эти задачи, используя CompletableFuture параллельно, но асинхронно с исполнителем:
CompletableFuture<Object> future1 = CompletableFuture.supplyAsync(() -> executeTask(), executor);
CompletableFuture<Object> future2 = CompletableFuture.supplyAsync(() -> executeTask(), executor);
CompletableFuture<Object> future3 = CompletableFuture.supplyAsync(() -> executeTask(), executor);
executeTask() - это метод, который извлекает задачу для выполнения, теперь проблема в том, что когда я начинаю выполнять приведенный выше код, тогда задача1() выбирается всеми будущими1, будущими2 и будущими3, а задача2 выбирается всеми, потому что все фьючерсы работают параллельно и асинхронно. То, что я хотел, - как только задача будет выбрана любым Future Object, она не должна быть выбрана другими. Как мне этого добиться. Любая помощь будет оценена по достоинству. Спасибо.
Вот код executeTask(), что он делает: Существует карта (статическая TreeMap> map = new TreeMap‹>();), которая содержит имя метода и метод, которые должны быть возвращены как задачи, такие как задача1, задача2 и т. д.. Теперь, что я здесь делаю: я повторяю карту и нахожу ту запись, которая не имеет статуса ключа, что означает, что эта задача может быть выполнена и возвращена, и перед возвратом я помещаю ключ состояния, чтобы его нельзя было подобрать очередной раз. Теперь все фьючерсы работают как асинхронные, поэтому все они выбирают задачу1 вместе и так далее.
public static Object executeTask()
{
Object result = null;
try
{
Method method = null;
for(Entry<String, HashMap<String, Method>> en : map.entrySet())
{
if(!en.getValue().containsKey("status"))
{
System.out.println("Found free task: "+en.getKey().toString());
method = en.getValue().get(en.getKey());
en.getValue().put("status", ConcurrencyPoC_CompletableFuture.class.getMethod("toString"));
break;
}
}
if(method != null)
{
System.out.println("Executing : "+method.getName());
result = (String) method.invoke(new ConcurrencyPoC_CompletableFuture());
}
}catch(Exception e)
{
e.printStackTrace();
}
return result;
}