我这样的任务很少:
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()是检索要执行的任务的方法,现在问题是当我开始执行上面的代码时,所有future1,future2和future3以及task2被所有人接收到task1()因为所有期货都以并行和异步的方式运行。 我想要的 - 一旦任何未来对象接收任务,就不应该被其他人接收。我如何实现这一目标。任何帮助,将不胜感激。感谢。
这是executeTask()的代码,它的作用是:有一个map(静态TreeMap&gt; map = new TreeMap&lt;&gt;();),它包含作为task1返回的方法名称和方法,任务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;
}
答案 0 :(得分:0)
使executeTask()仅返回实际任务一次,并且在多次调用后不执行任何操作。
您可以对任务使用synchronized,Lock或AtomicReference(我会做最后一个)