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/