如何在Java中创建不同时运行某些任务的线程池?

如何在Java中创建不同时运行某些任务的线程池?,java,multithreading,Java,Multithreading,我希望将任务提交到线程池(或执行器服务),但如果执行器中已有一个任务具有相同的密钥,则不应同时执行该任务 具体来说,这是针对构建工具的,用于防止源树的同一部分的任务同时执行 这是一个我想要这种行为的例子: public class Example { public static void main(String[] args) throws Exception { ExecutorService service = Executors.newFixedThreadPo

我希望将任务提交到线程池(或执行器服务),但如果执行器中已有一个任务具有相同的密钥,则不应同时执行该任务

具体来说,这是针对构建工具的,用于防止源树的同一部分的任务同时执行

这是一个我想要这种行为的例子:

public class Example {

    public static void main(String[] args) throws Exception {

        ExecutorService service = Executors.newFixedThreadPool(2);

        Path resource = Paths.get("tmp");

        service.submit(() -> {
            Files.write(resource, Collections.singleton("foo"));
            Thread.sleep(10);

            if (!new String(Files.readAllBytes(resource)).equals("foo")) {
                System.err.println("someone changed my stuff");
            }


            return null;
        });
        service.submit(() -> Files.write(resource, Collections.singleton("bar")));
        service.shutdown();
        service.awaitTermination(1, TimeUnit.MINUTES);
    }
}

尝试使用两个不同的执行器执行不同类型的任务,如果第一个池已完成,则启动另一个

ExecutorService executor1 = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
     Runnable worker = new FirstTask("" + i);
         executor1.execute(worker);
     }
     executor1.shutdown();

  while (!executor.isTerminated()) {
    }

ExecutorService executor2 = Executors.newFixedThreadPool(5);
    for (int i = 0; i < 10; i++) {
         Runnable worker = new AnotherTask("" + i);
             executor2.execute(worker);
    }
    executor2.shutdown();
ExecutorService executor1=Executors.newFixedThreadPool(5);
对于(int i=0;i<10;i++){
Runnable worker=新的第一个任务(“+i”);
执行人1.执行(工人);
}
执行器1.关机();
而(!executor.isTerminated()){
}
ExecutorService executor2=Executors.newFixedThreadPool(5);
对于(int i=0;i<10;i++){
Runnable worker=新的另一个任务(“+i”);
执行人2.执行(工人);
}
执行器2.关机();

解决方案是为每个密钥使用单独的单线程执行器。由于可能存在多个键,为每个键创建一个线程可能会很昂贵,因此我们将单线程执行器替换为一个轻量级的
SerialExecutor
,它的行为类似于单线程执行器,但没有自己的线程,在需要时从一些普通的后端执行器借用一个线程<代码>串行执行器如中所述。可在我的


参见类似问题

请提供代码的相关部分。添加一个适当的示例输入/输出数据。为什么不使用一个线程,所有传入线程都将在队列中,并在当前运行的线程完成后立即执行
final ExecutorService exService=Executors.newSingleThreadExecutor()这听起来是个好主意-但我不确定这是否可能,因为这不是关于意外行为(我可以提供一个例子),而是一种我认为默认JRE的类和代码中不存在的功能。我会尽力告诉我你的想法。我特别想运行多线程。