Наше Java-приложение запускает рабочий поток (используя Thread.start()
).Вскоре после этого он вызывает Thread.join()
в рабочем потоке.Рабочий поток делает некоторые вещи и завершается.Первый поток завершает вызов join()
и продолжает свой веселый путь.Стандартный материал:
Thread t = new WorkerThread();
t.start();
// Blah blah
t.join();
class WorkerThread extends Thread {
public void run() {
// Do some stuff
}
}
По крайней мере, так оно должно работать и как оно работает в любом случае, которое мы можем воспроизвести.Однако у нас есть один клиент, который постоянно сталкивается с проблемами.
Глядя на потоки, использующие PsiProbe, они видят, что рабочий поток создан.Он работает какое-то время, но через некоторое время исчезает из списка потоков.Это происходит в неожиданное время (в зависимости от времени других событий, связанных с рабочим потоком).Основной поток никогда не выходит из вызова join()
.
Это, похоже, нарушает контракт join()
и подразумевает какую-то ошибку уровня JVM.Кто-нибудь был свидетелем такого поведения, или есть какие-либо идеи, что могло бы вызвать его?клиент, но кажется вероятным, что я действительно не знал, что я думал, что я знал: основной поток, скорее всего, не блокируется в join()
вообще, но в точке, предшествующей этому.все равно для идей.