【问题标题】:How to pause Main thread to execute 2 methods concurrently, then return back to Main thread?如何暂停主线程并发执行2个方法,然后返回主线程?
【发布时间】:2019-01-15 17:33:17
【问题描述】:

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

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

 ExecutorService executorService = Executors.newFixedThreadPool(2);

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

            // close executorService
            executorService.shutdown();

【问题讨论】:

    标签: java multithreading concurrency


    【解决方案1】:

    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() 会阻塞主线程,直到两个期货都完成。另外,如果您需要多次创建执行器服务,最好保留执行器服务而不调用shutdown()。线程将简单地停放。

    【讨论】:

    • 当然,如果程序只向线程池提交一个任务,并让主线程运行,它也可以工作,并且使用更少的资源执行其他任务。
    猜你喜欢
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多