abstract:一、線程的狀態(tài) Java中,線程的狀態(tài)有以下6類(lèi):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類(lèi):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()方法啟動(dòng)線程t,t線程的狀態(tài)會(huì)從New -> Runnable,t線程和main主線程同時(shí)執(zhí)行。
如果把t.start()改成t.run(),則是普通的調(diào)用方法,同步執(zhí)行,System.out.println("main end")語(yǔ)句必須等t.run()方法執(zhí)行完畢之后才能執(zhí)行。
注意:t.run()方法不會(huì)改變線程t的狀態(tài),也就是說(shuō)線程沒(méi)有啟動(dòng)。
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()方法之后釋放鎖,線程進(jìn)入waiting狀態(tài)。常見(jiàn)用法如上所示。如果有其他線程通過(guò)調(diào)用object.notify()或者object.notifyAll()方法時(shí),線程必須再次獲取到obj鎖,然后才能繼續(xù)執(zhí)行obj.wait()后的語(yǔ)句,即打印 "testMethod end"。obj.wait(timeout)方法類(lèi)似,也需要先釋放鎖。
wait()方法是Object類(lèi)的方法,而sleep(timeout)方法是Thread類(lèi)的方法。線程調(diào)用sleep(timeout)方法,狀態(tài)從runnable -> timed_waiting,但是不釋放鎖。
3、interrupt()方法
當(dāng)線程調(diào)用interrupt()方法時(shí),只是設(shè)置了線程的中斷狀態(tài)。 也就是說(shuō)如果線程處于runnable或者blocked狀態(tài)的時(shí)候,調(diào)用interrupt()方法并不會(huì)終止線程。于是,我想當(dāng)然的理解如果線程處于waiting或者timed_waiting狀態(tài)時(shí),調(diào)用interrupt方法會(huì)拋出異常,從而終止線程。
然后發(fā)現(xiàn)錯(cuò)了。見(jià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異常,意味著如果線程通過(guò)調(diào)用awaitUninterruptibly從而使得線程狀態(tài)為waiting,并不會(huì)因?yàn)檎{(diào)用interrupt()方法而中斷。實(shí)際測(cè)試,線程狀態(tài)不響應(yīng)interrupt方法,只有通過(guò)condition.singal或者singalAll才能喚醒線程。
實(shí)際測(cè)試,wait(), wait(timeout), join(), sleep(timeout), await(), await(timeout)等方法都是可以被interrupt()方法中斷的。
三、synchronized關(guān)鍵字
1、synchronized(object): 同步方法或者代碼塊,鎖是一個(gè)對(duì)象。
2、synchronized(this): this指的是當(dāng)前對(duì)象。
3、針對(duì)靜態(tài)方法,比如synchronized public static void testMethod(),鎖是當(dāng)前的Class類(lèi)。
4、如果代碼拋出異常,鎖自動(dòng)釋放。