如何将任务分配给CompletableFuture,以便一旦拾取,就不应该再次拾取它

时间:2016-09-18 07:45:47

标签: java multithreading threadpool executorservice completable-future

我这样的任务很少:

            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;
}

1 个答案:

答案 0 :(得分:0)

使executeTask()仅返回实际任务一次,并且在多次调用后不执行任何操作。

您可以对任务使用synchronized,Lock或AtomicReference(我会做最后一个)