本節書摘來異步社群《java 7并發程式設計實戰手冊》一書中的第1章,第1.5節,作者:【西】javier fernández gonzález,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
通過上一節,你已經學會了如何去中斷執行中的線程,也學會了如何線上程對象中去控制這個中斷。上一個例子中使用的機制,可以使用線上程很容易被中斷的情況下。但是,如果線程實作了複雜的算法并且分布在幾個方法中,或者線程裡有遞歸調用的方法,我們就得使用一個更好的機制來控制線程的中斷。為了達到這個目的,java提供了interruptedexception異常。當檢查到線程中斷的時候,就抛出這個異常,然後在run()中捕獲并處理這個異常。
在本節中,我們将實作線程類來完成下面的内容,它在一個檔案夾及其子檔案夾中尋找一個指定的檔案。這個範例将示範如何用interruptedexception異常來控制線程的中斷。
準備工作
本節的範例是在eclipse ide裡完成的。無論你使用eclipse還是其他的ide(比如netbeans),都可以打開這個ide并且建立一個新的java工程。
範例實作
按照接下來的步驟實作本節的範例。
1.建立一個名為filesearch的類,并且實作runnable接口。
``
public class filesearch implements runnable {``
2.聲明兩個私有屬性,一個是我們将要查找的檔案名稱,另一個是初始檔案夾。實作這個類的構造器,用來初始化這兩個屬性。
@override
public void run() {
file file = new file(initpath);
if (file.isdirectory()) {
} catch (interruptedexception e) {
}
}<code>`</code>
4.實作directoryprocess()方法,這個方法會擷取一個檔案夾裡的所有檔案和子檔案夾,并進行處理。對于每一個目錄,這個方法将遞歸調用,并且用相應目錄名作為傳入參數。對于每個檔案,這個方法将調用fileprocess()方法。處理完所有的檔案和檔案夾後,這個方法将檢查線程是不是被中斷了,如果是,就抛出interruptedexception異常。
private void fileprocess(file file) throws interruptedexception
{
6.現在,我們實作這個範例的主類。實作一個包含main()方法的main類。
filesearch searcher=new filesearch("c:\","autoexec.bat");
thread thread=new thread(searcher);
thread.start();<code>`</code>
8.等待10秒鐘,然後中斷線程。