java线程interrupt用法_Java线程中interrupt那点事 | 学步园

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并发编程相关博客:

更多阅读:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值