java - 如何暂停主线程并发执行2个方法,然后返回主线程?

标签 java multithreading concurrency

我有一个包含 5 个方法的类。在程序的某个时刻,我想同时运行其中 2 个方法。下图说明了我正在谈论的内容。 method2() 完成后,我希望 method3() 和 method4() 同时运行。 Method3() 和 method4() 本质上做的是完全相同的事情,但具有隔离的资源,因此不必同步。 当 method3() 和 method4() 完成时,我希望辅助线程被销毁并且程序返回到主线程。最好的方法是什么?

Image of program threads

我尝试调用 ExecutorService,但这似乎创建了与主线程同时运行的线程 - 而不是暂停主线程。

 ExecutorService executorService = Executors.newFixedThreadPool(2);

            // method reference introduced in Java 8
            executorService.submit(this::method3());
            executorService.submit(this::method4());

            // close executorService
            executorService.shutdown();

最佳答案

executorService.submit返回Future<T> ,您可以调用 get()阻止你的线程。所以:

ExecutorService executorService = Executors.newFixedThreadPool(2);

Future<?> f1 = executorService.submit(this::method3());
Future<?> f2 = executorService.submit(this::method4());

f1.get();
f2.get();

executorService.shutdown();

f1.get()f2.get()将阻塞主线程,直到两个 future 都完成。另外,如果需要多次创建执行器服务,最好保留执行器服务而不调用 shutdown()在上面。线程将简单地停止。

关于java - 如何暂停主线程并发执行2个方法,然后返回主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54204075/

相关文章:

swift - 在 Swift 中,当两个线程获取并设置一个非线程安全属性时会发生什么?

java - 通过父类(super class)对象的 ArrayList 访问子类方法?

java - 将参数传递给 java 准备语句

c# - 委托(delegate)上的 BeginInvoke 和 EndInvoke 是否都生成完整的栅栏?

.net - ReadOnlyCollection <T>线程安全

java - 为什么我对 ActionListener 的更改没有立即生效?

java - 为什么 instanceof 运算符允许在无界通配符类型上使用,而在 Java 中的其他参数化类型上却不允许?

java - 有没有什么方法可以获取 ENC 图层的所有功能并在 java 或 .net ArcGIS SDK 中切换它们的可见性?

java - 在JAVA中以编程方式监控JVM的堆栈区域?

c - 多次互斥锁定