【线程】中断的调用与处理以及设置线程超时

线程中断

        //中断主线程
        Thread.currentThread().interrupt();//线程自己中断自己
       
        Thread worker = new Thread();
        worker.start();
       
        worker.interrupt();//线程A中断线程B
       
        Thread.interrupted();//检测中断状态,并清除中断状态,中断标记置为false
        
        worker.isInterrupted();//检测中断状态,不会改变中断状态

package org.thread;

public class InterruptDemo1 {
	
	public static void main(String[] args) {
		//中断主线程
		Thread.currentThread().interrupt();
		
		Worker worker = new Worker();
		Thread t = new Thread(worker);
		t.start();
		
		System.out.println("Main Thread.isInterrupted: "+Thread.currentThread().isInterrupted());

		try {
			Thread.sleep(100);//由于主线程处于中断状态,调用sleep()将会抛出InterruptedException
		} catch (InterruptedException e) {
			/**
			 * 在catch块中捕获到被抛出的Interrupted异常时,被中断线程的中断状态已经被清空(中断状态=false),以便确保该线程处于正常状态继续执行
			 * 因为中断仅仅是立即停止线程当前正在做的事,在catch到中断之后,可以让该线程去做另一件事情,所以进入catch块时中断状态实际上已经置为false了!
			 * 至于如何处理中断异常,需要根据具体情况而定:
			 * 	1. return 退出循环/方法
			 *  2. 抛出InterruptedException到上层
			 * 	3. 返回到线程池中,继续准备为下一个请求进行服务 
			 */
			System.out.println("The interrupted status of the current thread is cleared when this exception is thrown.");
			System.out.println("Main Thread.isInterrupted: "+Thread.currentThread().isInterrupted());//false
			//Clear Interrupted status, just make sure. Don't confused!
			Thread.interrupted();
			System.out.println("Main Thread.isInterrupted: "+Thread.currentThread().isInterrupted());//false
		}
		
		t.interrupt();
	
	}
	
	private static class Worker implements Runnable {

		@Override
		public void run() {
			//doWork01();
			doWork02();
		}
		
		/**
		 * 此循环不会因为别的线程调用了本线程的interrupt()而停止
		 * 因为,既没有中断异常的捕获,也没有中断状态的检测,所以,程序不会对中断做出任何响应
		 */
		private void doWork01() {
			while(true)
				System.out.println("Interrupte Has No Effect To Me!");
		}
		
		/**
		 * 在循环中主动检测中断状态,当发现自己被中断时,退出
		 */
		private void doWork02() {
			while(true) {
				System.out.println("Because there is no interruptedException can be thrown, so we need to check 'interrupt status' ourselves!");
				if(Thread.currentThread().isInterrupted()) {//or Thread.interrupted()
					System.out.println("We have been interrupted, so just stop the work and return to home!");
					return;
				}
			}
		}
		
	}
}
超时后中断线程:
package org.thread;

/**
 * 监视线程,超时便中断 
 */
public class InterruptDemo2 {
	
	public static void main(String[] args) throws InterruptedException {
		Worker worker = new Worker();
		Thread t = worker.work();
		
		int patience = 5000;//5s
		long start = System.currentTimeMillis();
		
		while(t.isAlive()) {
			printMessage("Still waiting...");
			t.join(1000);//主线程等待1s后再执行
			if(System.currentTimeMillis()-start > patience && t.isAlive()) {
				printMessage("Tired of waiting!!!");
				t.interrupt();
				t.join();//主线程无限等待,直到t线程结束后,主线程才继续往下执行
			}
		}
		
		System.out.println("Over!");
		
	}
	
	private static void printMessage(String message) {
		String tName = Thread.currentThread().getName();
		System.out.format("%s: %s%n", tName, message);
	}
	
	private static class Worker implements Runnable {
		
		final String[] messages = {"AAAAA","BBBBB","CCCCC","DDDD"};

		@Override
		public void run() {
			for(int index=0; index<messages.length; index++) {
				try {
					Thread.sleep(2000);
					printMessage(messages[index]);
				} catch (InterruptedException e) {
					printMessage("Not finished");
					return;
				}
			}
		}
		
		public Thread work() {
			Thread t = new Thread(this);
			t.start();
			return t;
		}
	}
	
}

猜你喜欢

转载自just2learn.iteye.com/blog/2091104