Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,在单独的线程中运行许多方法并等待所有方法完成的最简单方法是什么?_Java_Multithreading_Function - Fatal编程技术网

在java中,在单独的线程中运行许多方法并等待所有方法完成的最简单方法是什么?

在java中,在单独的线程中运行许多方法并等待所有方法完成的最简单方法是什么?,java,multithreading,function,Java,Multithreading,Function,我想要一个在独立线程中运行两个或多个方法的方法。我希望确保在所有线程完成之前,该方法不会完成。我的解决方案是 功能: public void runParallel(Runnable... runnables) throws InterruptedException { List<Thread> threads = new ArrayList<Thread>(runnables.length); for (Runnable runnable :runnables) {

我想要一个在独立线程中运行两个或多个方法的方法。我希望确保在所有线程完成之前,该方法不会完成。

我的解决方案是

功能:

public void runParallel(Runnable... runnables) throws InterruptedException {

List<Thread> threads = new ArrayList<Thread>(runnables.length);

for (Runnable runnable :runnables) {
    Thread th = new Thread(runnable);
    threads.add(th);
    th.start();
}

for (Thread th : threads) {
    th.join();
}
runParallel(new Runnable() {
                @Override
                public void run() {
                    method1()
                }
            }, new Runnable() {
                @Override
                public void run() {
                    method2()
                }
            }
);

还有更好的主意吗?也许有一条我不知道的更短的路;)

最好的方法是利用Executor服务API来管理线程池,而不是自己启动一个开放的线程数

ExecutorService pool = Executors.newCachedThreadPool();
for (Runnable r : new Runnable[] {
    new R() { void r() { myMethod1(); }},
    new R() { void r() { myMethod2(); }},
})
  pool.execute(r);
pool.shutdown();
pool.awaitTermination(60, TimeUnit.SECONDS);



请注意,不建议坚持每个方法都在自己的独立线程中运行。线程非常重(每个线程分配一个完整的调用堆栈),而且随着线程数量的增加,性能实际上会下降,远远超过可用处理器内核的数量。

我更喜欢这样:

public static void runParallel(Runnable... runnables) throws InterruptedException {
    final CountDownLatch done = new CountDownLatch(runnables.length);
    for (final Runnable r: runnables) {
        new Thread(new Runnable() {
             public void run() {
                 try {
                     r.run();
                 } finally {
                     done.countDown();
                 }
             }
        }).start();
    }
   done.await();
}
这种方法的一个优点是它也适用于线程池(即,您可以将
新线程(…).start()
替换为
executor.submit(…)


它还允许您使用预先存在的线程池,这与基于
awaittemination()
的解决方案不同,后者强制您为每次调用创建新的线程池。

遵循damienix提供的API:


在java中,函数是什么意思?我知道一些方法。使用executors有什么好处?@damienix它们将队列和线程池结合起来,允许您重新使用线程,收集单个任务的结果/异常,取消任务,并作为一个整体关闭线程池。除了Peter的观点,线程池在启动和停止线程的方式上是灵活和可配置的。从Java 5开始,
Thread
仅被视为一个低级类。顺便说一句,没有
ExecutorServices.hutdownAndAwaitTermination()
,您可能会使用
pool.shutdown();池。等待终止(长,时间单位)是;它在Javadoc中,但作为这样一个客户机方法的示例。它应该是
关闭和等待终止(池)
。为了清晰起见,我用一个简单的两行文字替换了它。为了将来的参考,编辑一个答案只是为了纠正和改进它已经提出的观点是有意义的;完全用你自己的代码替换原来的代码只意味着你是通过别人的嘴说话,向上和向下的投票都是通过原来的回答者。顺便说一句,谢谢你指出我R课上的错误;更正。我真的不知道应该在哪里为您放置代码建议,评论这是一个好地方。正如你所注意到的,我可能改变得太多了。无论如何,谢谢你的回答。首选的(甚至是预期的)方式是将你已有的代码放在你的问题中,这样回答者就有了一个清晰的起点。你是对的。这是一个正确的问题,因为我希望你们的答案不是我的问题,而是你们不必阅读的答案,这是错误的,对不起。现在我明白了;)但是,
executor.submit(runnable.get()
做了同样的事情,而客户端没有做任何努力。
public static void runParallel(Runnable... runnables) throws InterruptedException {
    final CountDownLatch done = new CountDownLatch(runnables.length);
    for (final Runnable r: runnables) {
        new Thread(new Runnable() {
             public void run() {
                 try {
                     r.run();
                 } finally {
                     done.countDown();
                 }
             }
        }).start();
    }
   done.await();
}
public void runParallel(Runnable... runnables) throws InterruptedException {
    final ExecutorService pool = Executors.newFixedThreadPool(runnables.length);
    for (Runnable runnable: runnables) {
        pool.submit(runnable);
    }
    pool.shutdown();
    pool.awaitTermination(1, TimeUnit.MINUTES);
}