【问题标题】:ThreadPoolExecutor : awaiting termination outside the methodThreadPoolExecutor :等待方法外的终止
【发布时间】:2015-10-30 12:07:14
【问题描述】:

当前情况: 我的代码(假设“类调用者:caller()”)将调用一个类(类 ThreadPoolClass:writeData())的方法,该方法通过 ThreadPoolExecutor 在内部执行它的任务。现在这个实现不会等待它的所有任务终止。

问题: 虽然我的代码(方法调用者())需要等到这个(方法 writeData())ThreadPoolExecutor 的所有任务都完成。目前控制器在提交任务后返回 caller() 方法。

ThreadPoolClass 的实现是无法改变的,所以我想弄清楚如何才能做到这一点。

//示例代码

class Caller {
    public static void main(String[] args) {
        ThreadPoolClass t = new ThreadPoolClass();
        t.writeData();

        // I want to wait here until the execution is complete
    }
}

class ThreadPoolClass{
    void writeData() {
        Runnable thread = new Runnable() {

            @Override
            public void run() {
                //  Do some database commit operations

            }
        };
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);
        fixedThreadPool.submit(thread);
        fixedThreadPool.shutdown();
    }
}

任何提示都会有所帮助——无论是否可能。

注意**这只是一个示例,我的原始代码有一个类方法调用链,最终使用 ThreadPoolExecutor 执行该方法。

谢谢 菜

【问题讨论】:

  • 如果我们能看到一些实际的代码会更容易。基本上,您可以使用 Futures、Executor.awaitTermination(),仅举两个例子。但是,如果不更改 ThreadPoolClass 的代码,就不能说是否有可能。
  • 我已经添加了示例代码。请进行相同的验证。
  • 如果你想等到执行结束不做其他事情,是否需要使用线程?
  • 我看不到不更改 ThreadPoolClass 代码的可能性,除非编写一个新的类做同样的事情,但有可能等待/阻塞或回调。
  • 嗨@Zavael 这是一些预先存在的API,我试图在我的应用程序中重用。

标签: java multithreading threadpool threadpoolexecutor


【解决方案1】:

感谢大家的投入。因此,基于上述 cmets 和我的一些分析,我假设这无法实现。总结的cmets:

我看不到不更改 ThreadPoolClass 代码的可能性,除非编写一个新的类做同样的事情,但有可能等待/阻塞或回调。 – 菲尔多

是否可以只复制“执行一些数据库提交操作”并在主线程上按顺序执行它们?重用代码很棒,但 API 让它变得不可能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2017-05-02
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多