现在的位置: 首页 > 综合 > 正文

Java线程中interrupt那点事

2017年12月10日 ⁄ 综合 ⁄ 共 3119字 ⁄ 字号 评论关闭

1.先看一下例子程序:

import java.io.IOException;
import java.net.ServerSocket;

import javax.rmi.CORBA.Tie;

/*
 *@author: ZhengHaibo  
 *web:     http://blog.csdn.net/nuptboyzhb
 *mail:    zhb931706659@126.com
 *2014-3-16  Nanjing,njupt,China
 */
public class TestThread {
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Thread t1=new Thread(){
			@Override
			public void run(){
				try {
					int i=0;
					while (i++<100000000){
						//nothing
					}
					System.out.println("A1");
				} catch (Exception e) {
					// TODO: handle exception
					System.out.println("B1");
				}
			}
		};
		t1.start();
		t1.interrupt();//无法中断正在运行的线程
		try {
			t1.join();
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		
		
		Thread t2=new Thread(){
			@Override
			public void run(){
				try {
					Thread.sleep(5000);
					System.out.println("A2");
				} catch (Exception e) {
					// TODO: handle exception
					System.out.println("B2 "+e.toString());
				}
			}
		};
		t2.start();
		t2.interrupt();//可以中断正在休眠的线程,并抛出异常
		try {
			t2.join();
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		
		
		Thread t3=new Thread(){
			@Override
			public void run(){
				try {
					this.wait(5000);
					System.out.println("A3");
				} catch (Exception e) {
					// TODO: handle exception
					System.out.println("B3 "+e.toString());
				}
			}
		};
		t3.start();
		t3.interrupt();
		
		try {
			t3.join();
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		
		Thread t4=new Thread(){
			@Override
			public void run(){
				try {
					synchronized (this) {
						this.wait(5000);
					}
					System.out.println("A4");
				} catch (Exception e) {
					// TODO: handle exception
					System.out.println("B4 "+e.toString());
				}
			}
		};
		t4.start();
		t4.interrupt();
		try {
			t4.join();
		} catch (InterruptedException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		try {
			final ServerSocket serverSocket=new ServerSocket(8080);
			
			Thread t5=new Thread(){
				@Override
				public void run(){
					try {
						serverSocket.accept();
						System.out.println("A5");
					} catch (Exception e) {
						// TODO: handle exception
						System.out.println("B5 "+e.toString());
					}
				}
			};
			t5.start();
			t5.interrupt();//无法中断
			t5.stop();//线程停止
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		try {
			t4.start();
			System.out.println("A6");
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("B6 "+ e.toString());
		}
	}

}

运行结果为:

A1
B2 java.lang.InterruptedException: sleep interrupted
B3 java.lang.IllegalMonitorStateException
B4 java.lang.InterruptedException
B6 java.lang.IllegalThreadStateException

附录1:sleep和wait的区别

1、这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。

sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。

2、最主要sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。

3、使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用 
   synchronized(x){ 
      x.notify() 
     //或者wait() 
   }

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常


相关博客:

java并发编程相关博客:

更多阅读:
[1]synchronized与ReentrantLock 的使用:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html
[2]Java线程面试50题:http://www.importnew.com/12773.html

[3].Java并发性和多线程介绍目录http://ifeve.com/java-concurrency-thread-directory/

[4]volatile的使用:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

抱歉!评论已关闭.