如果Java程序不只有一个执行线程,只有当所有线程结束的时候这个程序才能运行结束。更确切的说是所有的非守护线程运行结束的时候,或者其中一个线程调用了System.exet()方法时,程序才运行结束。
Java提供了中断机制,我们可以采用它来结束一个线程。我们创建一个线程,使其运行5秒后通过中断机制强制使其终止。程序检查数字是否是质数。
package com.concurrency; public class PrimeGenerator extends Thread{ //继承自Thread类,覆写run方法即可。 @Override public void run(){ long number = 1L;//检查一个数字是否是质数 while(true){ if(isPrime(number)){ System.out.println(number);//是质数就打印 } if(isInterrupted()){//每检查一个数就检查该线程是否被中断 System.out.println("Has been Interrupted!"); return; } number++; } } private boolean isPrime(long number) {//判断质数的函数 if(number < 2) return true; for(long i = 2; i < number; i++){ if((number % i) == 0){ return false; } } return true; } public static void main(String[] args) { Thread task = new PrimeGenerator();//创建对象 task.start();//调用start就会运行run函数.就会引出来一个线程到一边去执行。 //值函数还是会继续向下执行,两者互不干扰 try{ Thread.sleep(2000);//让线程休眠2秒 } catch(InterruptedException e) { e.printStackTrace(); } task.interrupt(); } }
下述方法的目的是在指定路径中查找文件是否存在。可以迭代查找文件夹。
package com.concurrency; import java.io.File; import java.util.concurrent.TimeUnit; public class FileSearch implements Runnable{ private String initPath;//初始要检索的文件路径 private String fileName;//要检索的文件名 public FileSearch(String intiString, String fileName){ this.initPath = intiString; this.fileName = fileName; } @Override public void run(){//实现了接口也就要是实现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()){//如果线程中断了,就在这里抛出异常,在run中捕获异常 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(); } } public static void main(String[] args) { FileSearch searcherFileSearch = new FileSearch("C:\\", "autoexec.bat"); Thread thread = new Thread(searcherFileSearch); thread.start(); try{ TimeUnit.SECONDS.sleep(10); } catch(InterruptedException e){ e.printStackTrace(); } thread.interrupt();//在这里中断线程,因为线程在几个复杂的方法中,且有了递归方法 //的调用。通过借助异常的方式来捕获异常 } }
原文地址:http://blog.csdn.net/yapian8/article/details/41482353