標籤:中斷機制
本文是學習網路上的文章時的總結,感謝大家無私的分享。
1、如果線程實現的是由複雜演算法分成的一些方法,或者他的方法有遞迴調用,那麼我們可以用更好的機制來控制線程中斷。為了這個Java提供了InterruptedException異常。當你檢測到程式的中斷並在run()方法內捕獲,你可以拋這個異常。
2、InterruptedException異常是由一些與並發API相關的Java方法,如sleep()拋出的。
下面以程式解釋
package chapter;import java.io.File;/** * <p> * Description:我們將實現的線程會根據給定的名稱在檔案件和子檔案夾裡尋找檔案,這個將展示如何使用InterruptedException異常來控制線程的中斷。 * </p> * * @author zhangjunshuai * @version 1.0 Create Date: 2014-8-11 下午3:10:29 Project Name: Java7Thread * * <pre> * Modification History: * Date Author Version Description * ----------------------------------------------------------------------------------------------------------- * LastChange: $Date:: $ $Author: $ $Rev: $ * </pre> * */public class FileSearch implements Runnable {private String initPath;private String fileName;public FileSearch(String initPath, String fileName) {this.fileName = fileName;this.initPath = initPath;}@Overridepublic void run() {File file = new File(initPath);if (file.isDirectory()) {try {directoryProcess(file);} catch (InterruptedException e) {System.out.printf("%s:The search has been interrupted", Thread.currentThread().getName());}}}private void directoryProcess(File file) throws InterruptedException {File list[] = file.listFiles();if (list != null) {for (int i = 0; i < list.length; i++) {if (list[i].isDirectory()) {directoryProcess(list[i]);} else {fileProcess(list[i]);}}}if (Thread.interrupted()) {throw new InterruptedException();}}private void fileProcess(File file) throws InterruptedException {if (file.getName().equals(fileName)) {System.out.printf("%s : %s\n", Thread.currentThread().getName(),file.getAbsolutePath());}if(Thread.interrupted()){throw new InterruptedException();}}}
package chapter;import java.util.concurrent.TimeUnit;public class Main4 {/** * <p> * </p> * @author zhangjunshuai * @date 2014-8-12 下午3:40:54 * @param args */public static void main(String[] args) {FileSearch searcher = new FileSearch("c:\\", "unintall.log");Thread thread = new Thread(searcher);thread.start();try {TimeUnit.SECONDS.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}thread.interrupt();}}
請注意程式中使用的是Thread.interrupted(),此方法和
isInterrupted()是有區別的。
另:JDK的TimeUnit是學習枚舉的好例子
參考:
並發編程網