遇到下列代碼來到(修改,使我的觀點明確):線程監視器中的任何一點都會重新啓動一個死鎖線程?
class ThreadWithQueue extends Thread {
Queue<Msg> msgQueue;
public void run() { while (!isInterrupted()) {processMessage(queue.take());}
}
class MessageDispatcher {
ThreadsWithQueue[] threads;
...
void dispatchMessage(Msg msg) {
int index = findMatchingThread(msg);
if (!threads[index].isAlive() || threads[index].isInterrupted()){
try {
threadCreateLock.lock();
threads[index] = createAndStartThread();
} finally {
threadCreateLock.unlock();
}
}
threads[index].queue.add(msg);
}
也就是說,有一個「消息調度」,可以重新啓動(即創建一個新的)線程,如果它發現當前的是死了或中斷。
注意兩個類都寫了由同一作者,居住在同一個包。
我的問題:
是否有這個任何一點從設計的角度/最佳實踐點「重啓死線」功能?
豈不是一個更好的辦法,只是有 '趕上(的Throwable){/ *忽略 /} *' 每個線程的運行()內方法(即內'ThreadWithQueue.run(){ ...}')?
你從哪裏看到死亡線程正在重新啓動?我不知道你從哪裏得到這段代碼(這不太好 - 你應該給出一個鏈接並將屬於你自己的代碼放在StackOverflow中),但是我認爲如果線程死了,這會啓動一個新線程。無論如何,需要上下文來判斷這是好還是壞。 – RealSkeptic
像catch(Throwable){/ * ignore * /}'這樣的事情通常不是一個好主意,如果throwables/exceptions沒有被處理,他們應該至少被記錄下來。 – Thomas
在這種情況下會捕獲「Throwable」嗎?另外,catch(Throwable x){/ * ignored * /}'從字面上看並不是一個好方法。只要捕獲'Throwable'即使處理異常也不是一個好主意,因爲它會捕獲諸如「OutOfMemoryError」之類的東西。 – Radiodef