亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Java并發(fā)編程總結(jié)——線程狀態(tài)、synchronized

Original 2016-11-11 15:02:46 354
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)系可用下圖表示:

 764863-20160512184835421-489690266.png

二、常用方法介紹

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)釋放。


Release Notes

Popular Entries