如何在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的类和代码中不存在的功能。我会尽力告诉我你的想法。我特别想运行多线程。