天天看點

《Java程式員面試秘笈》—— 1.5 線程中斷的控制

本節書摘來異步社群《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秒鐘,然後中斷線程。