Мне нужно уметь вводить код выхода для текущей текущей нити. Я боролся с этим на некоторое время, и я, наконец, пришел с решением здесь некоторый код похож на то, что я делаю:Обратный вызов обратного потока
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();
}
Это, кажется, работает хорошо, и делает именно то, что я хотел, моя единственная забота заключается в том, что если это вызывает какие-либо утечки или другие нежелательные побочные эффекты, я могу не видеть.
или это прекрасно, если это так полезно. Я мог видеть простую библиотеку, которая может динамически добавлять код выхода в существующие потоки.
Выглядит хорошо; просто помните, что обратный вызов будет работать в отдельном потоке. –
Перемещение обратного вызова к блоку 'finally' означает, что он будет запущен, если' join' выдает исключение, которое произойдет * до того, как завершит целевой поток. Кроме того, объединение никогда не будет генерировать исключение, если какой-либо внешний агент не начнет прерывать все потоки. –
Если анонимный поток, созданный внутри этого метода, прерван, очень сомнительно, следует ли вызывать обратный вызов. Точка прерывания потока - это остановить то, что она делает. Поскольку единственное, что делает этот поток, это ожидание вызова обратного вызова, единственной причиной его прерывания было бы предотвращение запуска обратного вызова. –