我需要能够为当前运行的线程注入一些退出代码。我已经在这个问题上挣扎了一段时间,我终于找到了一个解决方案,这里的代码与我正在做的类似:
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();
}
它似乎工作正常并完全符合我的要求,我唯一担心的是,如果这导致任何泄漏或其他不良副作用,我可能不会看到。
或者这是完全没问题的,如果是这样的话,这非常有用。我可以看到一个简单的库,它可以动态地将退出代码添加到现有的线程中。
答案 0 :(得分:3)
你最好做
new Thread () {
@Override
public void run () {
try
{
// Thread logic here
}
finally
{
// Thread exit logic here
}
}
}.start ();
答案 1 :(得分:2)
除非该线程正在积极协作,否则您不可能将代码注入到正在运行的线程中,例如AWT中的事件调度线程,它的根目录有一个循环,它将Runnables从队列中取出并执行它们。 / p>
您的设计可能会将数据争用引入以前是单线程的代码中,因此没有并发问题。
最后,该设计浪费了宝贵的系统资源(一个线程),除了等待另一个线程完成之外什么都不做。
如果您需要从外部修补现有代码,那么它可能是唯一的选择;如果没有,最好为它提供更有效的显式机制。
答案 2 :(得分:0)
您可以在callback.run();
阻止后移动catch
或在final
阻止移动{{1}},以确保无论如何都要移动