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();//無(wú)法中斷正在運(yùn)行的線程
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();//無(wú)法中斷
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());
}
}
}
運(yùn)行結(jié)果為:
A1
B2 java.lang.InterruptedException: sleep interrupted
B3 java.lang.IllegalMonitorStateException
B4 java.lang.InterruptedException
B6 java.lang.IllegalThreadStateException
附錄1:sleep和wait的區(qū)別
1、這兩個(gè)方法來(lái)自不同的類分別是,sleep來(lái)自Thread類,和wait來(lái)自O(shè)bject類。
sleep是Thread的靜態(tài)類方法,誰(shuí)調(diào)用的誰(shuí)去睡覺(jué),即使在a線程里調(diào)用了b的sleep方法,實(shí)際上還是a去睡覺(jué),要讓b線程睡覺(jué)要在b的代碼中調(diào)用sleep。
2、最主要是sleep方法沒(méi)有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
sleep不出讓系統(tǒng)資源;wait是進(jìn)入線程等待池等待,出讓系統(tǒng)資源,其他線程可以占用CPU。一般wait不會(huì)加時(shí)間限制,因?yàn)槿绻鹷ait線程的運(yùn)行資源不夠,再出來(lái)也沒(méi)用,要等待其他線程調(diào)用notify/notifyAll喚醒等待池中的所有線程,才會(huì)進(jìn)入就緒隊(duì)列等待OS分配系統(tǒng)資源。sleep(milliseconds)可以用時(shí)間指定使它自動(dòng)喚醒過(guò)來(lái),如果時(shí)間不到只能調(diào)用interrupt()強(qiáng)行打斷。
Thread.Sleep(0)的作用是“觸發(fā)操作系統(tǒng)立刻重新進(jìn)行一次CPU競(jìng)爭(zhēng)”。
3、使用范圍:wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用??? synchronized(x){?????? x.notify()????? //或者wait()??? }
4、sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
相關(guān)博客:
java并發(fā)編程相關(guān)博客:
更多閱讀:
[3].Java并發(fā)性和多線程介紹目錄http://ifeve.com/java-concurrency-thread-directory/
總結(jié)
以上是生活随笔為你收集整理的java线程interrupt用法_Java线程中interrupt那点事 | 学步园的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 买硬盘如何避免买到二手翻新的硬盘,ICM
- 下一篇: JavaWeb笔记05-解决线程安全问题