当前位置: 首页 > 知识库问答 >
问题:

Java中的并行任务

姜彬郁
2023-03-14

假设我有几个任务要在Java中并行运行。每个任务要么返回成功,要么返回失败。每个任务都有一个相关的截止日期。如果任务未在截止日期前完成,它将被中断(所有任务都可中断)并返回失败。

如果其中一个任务失败(即返回失败),我们将中断所有仍在运行的其他任务。

我们应该等到所有任务都完成,最后如果所有任务都返回成功,则返回成功;如果至少有一个任务返回失败,则返回失败。

你将如何实施它?我将使用util。同时发生的你会推荐哪种库原语?

共有2个答案

郑功
2023-03-14

我会使用带有CountDownLatchExecutorServiceFuture接口的数组列表来保存任务:

List<List<String>> elements = MyPartition.partition(bigObjectList, size); 
List<Future<?>> tasks = new ArrayList<Future<?>>();
ExecutorService executor = Executors.newFixedThreadPool(4);
CountDownLatch doneSignal =  new CountDownLatch(10);
for(List<String> l: elements) {         
   ReadTask worker = new ReadTask(doneSignal, l);
   tasks.add(executor.submit(worker));
}   

long timeout = 10000;
doneSignal.await(timeout, TimeUnit.MINUTES);
boolean notFinished = false;
if(doneSignal.getCount() > 0) {
  for(Future<?> fut : tasks) {
    if(!fut.isDone()) {
      System.out.println("Sub Thread " + fut + " has not finshed!");
      fut.cancel(true);             
      notFinished = true;
    }
  }
}
谷梁嘉悦
2023-03-14

ExecutorCompletionService似乎是最接近的

    ExecutorService ex = Executors.newCachedThreadPool();
    ExecutorCompletionService<Boolean> cs = new ExecutorCompletionService<Boolean>(
            ex);
    List<Callable<Boolean>> tasks = new ArrayList<Callable<Boolean>>();
       ... add tasks
    List<Future<Boolean>> futures = new ArrayList<Future<Boolean>>();
    for (Callable<Boolean> t : tasks) {
        futures.add(cs.submit(t));
    }
    for (!futures.isEmpty()) {
        try {
            Future<Boolean> f = cs.poll(1, TimeUnit.SECONDS);
            futures.remove(f);  // poll returns the same instance of Future as in the futures list
            if (f == null || !f.get()) {  // poll returns null on timeout
                break;
            }
        } catch (Exception e) {
            break;
        }
    }
    // cancel remaining tasks, if all finished OK the list will be empty
    for (Future<Boolean> future : futures) {
        future.cancel(true);
    }
 类似资料:
  • 我需要找到一种在java中并行执行任务(依赖和独立)的方法。 任务A和任务C可以独立运行 任务B取决于任务A的输出 我查了java。util。并发Future和Fork/Join,但看起来我们无法向任务添加依赖项。 有人能告诉我正确的Java API吗。

  • 问题内容: 我有一些我想在JS中做的资源密集型任务。对于这个问题,让我们假设它们是一些繁重的计算,而不是系统访问。现在,我想同时运行任务A,B和C,并在完成后执行一些功能D。 该异步库为此提供了一个很好的脚手架: 如果我正在做的只是计算,那么它将仍然同步运行(除非库将任务本身放在不同的线程上,我希望情况并非如此)。我如何使它实际上是平行的?异步代码通常不阻止调用者的事情是什么(使用NodeJS时)

  • 问题内容: 我想Java中没有等效的任务并行库(.NET 4.0)。真的吗?.NET的此功能提供了Java并发所不能提供的改进。 问题答案: Java提供了软件包,还提供了fork / join框架 。叉子/联接已计划包含在Java 7中,但现在可以下载并与Java 6一起使用。 Brian Goetz等人撰写的《Java Concurrency in Practice》是一本处理Java并发问题

  • 问题内容: 我正在使用python 2.7,我有一些看起来像这样的代码: 此处唯一的依赖项如下:dependent1需要等待任务1-3,Dependent2需要等待任务4-6,而dependent3需要等待依赖项1-2 …以下是可以的:首先运行全部6个任务并行,然后是前两个从属。 我希望尽可能多的任务并行运行,我已经在Google上搜索了一些模块,但是我希望避免使用外部库,并且不确定队列线程技术如

  • 我找不到关于我们被要求进行的调查的具体答案 我看到并行流在使用少量线程时性能可能不是那么好,而且当DB在处理当前请求的同时阻止下一个请求时,它的表现显然也不是那么好 然而,我发现实现任务执行器与并行流的开销是巨大的,我们实现了一个POC,它只需要这一行代码就能满足并发需求: 而在Task Executor中,我们需要重写Runnable接口并编写一些繁琐的代码,以使Runnable不是空的,并返回

  • 本文向大家介绍数据并行与任务并行,包括了数据并行与任务并行的使用技巧和注意事项,需要的朋友参考一下 数据并行 数据并行意味着在每个多个计算核心上并发执行同一任务。 让我们举个例子,对大小为N的数组的内容求和。对于单核系统,一个线程将简单地对元素[0]求和。。。[N-1]。但是,对于双核系统,在核0上运行的线程A可以对元素[0]求和。。。[N / 2-1],而在核心1上运行的线程B可以求和元素[N