如何正確停止執行緒

2021-09-29 07:16:55 字數 2682 閱讀 9266

原理:new乙個thread物件,如:thread thread=new thread(runnable介面的實現類);然後呼叫thread.interrupt()方法

使用thread.interrupt(),只是發出中段訊號,執行緒停不停止並不由自己決定,而是由被停止的執行緒決定,不是強制停止執行緒。

/**

* run內沒有sleep或者wait方法時,停止執行緒

*/public class rightwaystopthreadwithoutsleep implements runnable

num++;

}system.out.println("任務執行結束了");

}public static void main(string args) catch (interruptedexception e)

thread.interrupt();

}}

/**

* 帶有sleep方法中斷執行緒

*/public class rightwaystopthreadwithsleep

num++;

}thread.sleep(10000);//讓執行緒阻塞10秒

}catch (interruptedexception e )

};thread thread=new thread(runnable);

thread.start();

thread.sleep(9000);//我們在10s處無法中斷,因為10s時人家已經沒有停止,也就無法中斷

thread.interrupt();

}}

每次迭代(迴圈)都阻塞情況下停止執行緒:

/**

* 在使用過程中,每次迴圈都會呼叫sleep或wait等方法,那麼就不需要每次迭代都要檢查是否已經中斷

*/public class rightwaystopthreadeveryloop

num++;

system.out.println(thread.currentthread().getname());

thread.sleep(100);//讓執行緒阻塞0.01秒,所以出現列印的過程比較慢

//這個過程執行緒可能就會收到這個通知,將執行緒停止

}}catch (interruptedexception e )

};thread thread=new thread(runnable);

thread.start();

thread.sleep(5000);//讓執行緒執行到第五秒時停止

system.out.println(thread.currentthread().getname());

thread.interrupt();//傳送停止訊息,

}}

這裡要注意一種情況:就是while裡面方法try/catch的問題,一旦響應中斷,會將interrupt標記位清除

/**

* 如果while裡面放try-catch,會導致中斷失效

*/public class cantinterrupt

num++;

try catch (interruptedexception e) }};

thread thread=new thread(runnable);

thread.start();

thread.sleep(500);//主動傳送訊號

system.out.println(thread.currentthread().getname());

thread.interrupt();

}}

最佳停止執行緒的二種方法:

/**

* 最佳實踐:catch住了interruptedexception之後優先選擇:在方法簽名中丟擲異常

* 那麼在run()就會強制try/catch

*/public class rightwaystopthreadinproduct implements runnable catch (interruptedexception e) }}

private void throwinmethod() throws interruptedexception

public static void main(string args) throws interruptedexception

}

/**

* 最佳實踐2:在catch字句中呼叫thread.currentthread().isinterrupted()

* 來恢復設定中斷狀態,以便在後續的執行中,依然能夠檢查到剛才發生了中斷

*/public class rightwaystopthreadinproduct2 implements runnable

reinterrupe();}}

private void reinterrupe() catch (interruptedexception e)

}public static void main(string args) throws interruptedexception

}

最後補充一點關於異常的資訊:error和runtimeexception都是非檢查異常,也即是編譯器無法**的,而其他的異常都是受檢查異常

如何正確停止執行緒

使用interrupt來通知,並不是強制中斷,換句話說也就是不能強制停止執行緒,沒有停止執行緒的權力。當執行緒被阻塞時,會以拋異常的方式直接響應中斷訊號,不需要再像一種情況那樣進行判斷。如果在執行過程中,每次迴圈都會呼叫sleep或wait等方法,那麼不需要每次迭代都檢查是否已中斷,因為在阻塞狀態中...

如何停止執行緒?

使用退出標誌,使執行緒正常退出,也就是當run方法完成後執行緒終止。使用stop方法強行終止執行緒 這個方法不推薦使用,因為stop和suspend resume一樣,也可能發生不可預料的結果 使用interrupt方法中斷執行緒。表示讓當前等待的執行緒直接丟擲異常 如下 package com.n...

如何正確的更好的停止乙個執行緒?

前面提到過三種停止執行緒的方式,這三種方式不是被廢棄就是可能造成return汙染,最後雖然建議用拋異常法,但拋異常法依靠的是異常處理機制,下面介紹一種更常用的的停止執行緒的方法 通過在實現runnable介面的類裡面 或者是在繼承thread類的類裡面 定義乙個boolean型別的變數 標記 然後對...