本節(jié)主要討論一個問題,如何在Java中取消或關(guān)閉一個線程?
取消/關(guān)閉的場景
我們知道,通過線程的start方法啟動一個線程后,線程開始執(zhí)行run方法,run方法運行結(jié)束后線程退出,那為什么還需要結(jié)束一個線程呢?有多種情況,比如說:
很多線程的運行模式是死循環(huán),比如在生產(chǎn)者/消費者模式中,消費者主體就是一個死循環(huán),它不停的從隊列中接受任務,執(zhí)行任務,在停止程序時,我們需要一種"優(yōu)雅"的方法以關(guān)閉該線程。
在一些圖形用戶界面程序中,線程是用戶啟動的,完成一些任務,比如從遠程服務器上下載一個文件,在下載過程中,用戶可能會希望取消該任務。
在一些場景中,比如從第三方服務器查詢一個結(jié)果,我們希望在限定的時間內(nèi)得到結(jié)果,如果得不到,我們會希望取消該任務。
有時,我們會啟動多個線程做同一件事,比如類似搶火車票,我們可能會讓多個好友幫忙從多個渠道買火車票,只要有一個渠道買到了,我們會通知取消其他渠道。
取消/關(guān)閉的機制
Java的Thread類定義了如下方法:
public final void stop()
這個方法看上去就可以停止線程,但這個方法被標記為了過時,簡單的說,我們不應該使用它,可以忽略它。