abstrak:一、線程的狀態(tài) Java中,線程的狀態(tài)有以下6類:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。各狀態(tài)之間的關(guān)系可用下圖表示: 二、常用方法介紹1、thread.start()和thread.run()的區(qū)別 public static void ma
一、線程的狀態(tài)
Java中,線程的狀態(tài)有以下6類:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED。各狀態(tài)之間的關(guān)系可用下圖表示:
二、常用方法介紹
1、thread.start()和thread.run()的區(qū)別
public static void main(String[] args) { Thread t = new Thread(); t.start(); System.out.println("main end"); }
調(diào)用start()方法啟動線程t,t線程的狀態(tài)會從New -> Runnable,t線程和main主線程同時執(zhí)行。
如果把t.start()改成t.run(),則是普通的調(diào)用方法,同步執(zhí)行,System.out.println("main end")語句必須等t.run()方法執(zhí)行完畢之后才能執(zhí)行。
注意:t.run()方法不會改變線程t的狀態(tài),也就是說線程沒有啟動。
2、object.wait()和thread.sleep()的區(qū)別
private Object obj = new Object(); public void testMethod() throws InterruptedException { synchronized (obj) { obj.wait(); System.out.println("testMethod end"); } }
wait()方法主要用在synchronized同步方法或者同步塊中,意味著調(diào)用object.wait()之前必須先獲取鎖,調(diào)用wait()方法之后釋放鎖,線程進入waiting狀態(tài)。常見用法如上所示。如果有其他線程通過調(diào)用object.notify()或者object.notifyAll()方法時,線程必須再次獲取到obj鎖,然后才能繼續(xù)執(zhí)行obj.wait()后的語句,即打印 "testMethod end"。obj.wait(timeout)方法類似,也需要先釋放鎖。
wait()方法是Object類的方法,而sleep(timeout)方法是Thread類的方法。線程調(diào)用sleep(timeout)方法,狀態(tài)從runnable -> timed_waiting,但是不釋放鎖。
3、interrupt()方法
當(dāng)線程調(diào)用interrupt()方法時,只是設(shè)置了線程的中斷狀態(tài)。 也就是說如果線程處于runnable或者blocked狀態(tài)的時候,調(diào)用interrupt()方法并不會終止線程。于是,我想當(dāng)然的理解如果線程處于waiting或者timed_waiting狀態(tài)時,調(diào)用interrupt方法會拋出異常,從而終止線程。
然后發(fā)現(xiàn)錯了。見如下代碼:
private ReentrantLock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); public void testMethod() { try { lock.lock(); System.out.println("wait begin"); condition.awaitUninterruptibly(); System.out.println("wait end"); } finally { lock.unlock(); } }
condition.awaitUninterruptibly()方法不需要捕獲InterruptedException異常,意味著如果線程通過調(diào)用awaitUninterruptibly從而使得線程狀態(tài)為waiting,并不會因為調(diào)用interrupt()方法而中斷。實際測試,線程狀態(tài)不響應(yīng)interrupt方法,只有通過condition.singal或者singalAll才能喚醒線程。
實際測試,wait(), wait(timeout), join(), sleep(timeout), await(), await(timeout)等方法都是可以被interrupt()方法中斷的。
三、synchronized關(guān)鍵字
1、synchronized(object): 同步方法或者代碼塊,鎖是一個對象。
2、synchronized(this): this指的是當(dāng)前對象。
3、針對靜態(tài)方法,比如synchronized public static void testMethod(),鎖是當(dāng)前的Class類。
4、如果代碼拋出異常,鎖自動釋放。