8

我需要能够为当前正在运行的线程注入一些退出代码。我已经为此苦苦挣扎了一段时间,终于想出了一个解决方案,这里有一些类似于我正在做的代码:

public static void injectThreadExitCallback(final Runnable callback) {
    final curr = Thread.currentThread();
    new Thread() {
        @Override
        public void run() {
            try {
                curr.join();
                callback.run();
            } catch (InterruptedException ex) {
                ... logging ...
            }
        }
    }.start();
}

它似乎工作正常并且完全符合我的要求,我唯一担心的是,如果这会导致任何泄漏或其他不良副作用,我可能不会看到。

或者这完全没问题,如果是这样,这非常有用。我可以看到一个简单的库,它可以动态地将退出代码添加到现有线程。

4

3 回答 3

5

你最好这样做

new Thread () {
    @Override
    public void run () {
        try
        {
            // Thread logic here
        }
        finally
        {
            // Thread exit logic here
        }
    }
}.start ();
于 2013-02-08T20:12:23.933 回答
3

除非该线程正在积极协作,否则您不可能将代码注入正在运行的线程中,例如 AWT 中的 Event Dispatch Thread,它的根部有一个循环,可将 Runnables 从队列中取出并执行它们。

您的设计可能会将数据竞争引入以前是单线程的代码中,因此没有并发问题。

最后,该设计浪费了宝贵的系统资源(一个线程),只能等待另一个线程完成。

如果您需要它来从外部修补一些现有代码,那么它可能是唯一的选择;如果没有,最好为其提供一个更有效的明确机制。

于 2013-02-08T20:29:03.903 回答
0

如果您想确保无论如何调用它,您可以callback.run();在块之后catch或块中移动final

于 2013-02-08T20:14:24.737 回答