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

線程的掛起和恢復(fù)

原創(chuàng) 2016-11-07 14:18:06 580
摘要:(1)概述:線程的掛起操作實(shí)質(zhì)上就是使線程進(jìn)入“非可執(zhí)行”狀態(tài)下,在這個(gè)狀態(tài)下CPU不會(huì)分給線程時(shí)間片,進(jìn)入這個(gè)狀態(tài)可以用來暫停一個(gè)線程的運(yùn)行。在線程掛起后,可以通過重新喚醒線程來使之恢復(fù)運(yùn)行。         run() 和start() 是大家都很熟悉的兩個(gè)方法。把希望并行處理的代碼都放在run() 中;stat(

(1)概述:線程的掛起操作實(shí)質(zhì)上就是使線程進(jìn)入“非可執(zhí)行”狀態(tài)下,在這個(gè)狀態(tài)下CPU不會(huì)分給線程時(shí)間片,進(jìn)入這個(gè)狀態(tài)可以用來暫停一個(gè)線程的運(yùn)行。在線程掛起后,可以通過重新喚醒線程來使之恢復(fù)運(yùn)行。

         run() 和start() 是大家都很熟悉的兩個(gè)方法。把希望并行處理的代碼都放在run() 中;stat() 用于自動(dòng)調(diào)用run(),這是Java的內(nèi)在機(jī)制規(guī)定的。當(dāng)一個(gè)線程進(jìn)入“非可執(zhí)行”狀態(tài),必然存在某種原因使其不能繼續(xù)運(yùn)行,這些原因可能是如下幾種情況:
     A,通過調(diào)用sleep()方法使線程進(jìn)入休眠狀態(tài),線程在指定時(shí)間內(nèi)不會(huì)運(yùn)行。
     B,通過調(diào)用join()方法使線程掛起,如果某個(gè)線程在另一個(gè)線程t上調(diào)用t.join(),這個(gè)線程將被掛起,直到線程t執(zhí)行完畢為止。
     C,通過調(diào)用wait()方法使線程掛起,直到線程得到了notify()和notifyAll()消息,線程才會(huì)進(jìn)入“可執(zhí)行”狀態(tài)。
(2)sleep()方法:是一個(gè)使線程暫時(shí)停止一段執(zhí)行時(shí)間的方法,該時(shí)間由給定的毫秒數(shù)決定。下面演示一個(gè)使用sleep()方法的例子,如下。

class ThreadA extends Thread  
{  
    public void run(){  
        System.out.println("ThreadA is running");  
    }  
}  
public class TestNew {  
    public static void main(String[] args)throws InterruptedException {  
        // TODO Auto-generated method stub  
        ThreadA ta = new ThreadA();  
        ta.start();  
        ta.sleep(5000);  
        System.out.println("TestNew is running");  
    }  
}

執(zhí)行結(jié)果是:先ThreadA is running,5秒后,TestNew is running。有人會(huì)提出疑問:ta.sleep(5000);這個(gè)語句是ta線程睡眠了5秒,為什么執(zhí)行結(jié)果是main這個(gè)主線程也睡眠了5秒??jī)烧呤莾蓚€(gè)獨(dú)立的線程才對(duì)?原因是:在哪個(gè)線程里聲明sleep,哪個(gè)線程睡眠,所以是主線程睡眠了5000毫秒=5秒。

(3)join()方法:能夠使當(dāng)前執(zhí)行的線程停下來等待,直至join()方法所調(diào)用的那個(gè)線程結(jié)束,再恢復(fù)執(zhí)行。例如如果有一個(gè)線程A正在運(yùn)行,用戶希望插入一個(gè)線程B,并且要求線程B執(zhí)行完畢,然后再繼續(xù)線程A,此時(shí)可以使用join()方法來完成這個(gè)需求。

public class TestNew extends Thread  
{  
    public static int a = 0;  
    public void run(){  
        for(int k = 0;k < 5;k ++){  
            a = a + 1;  
        }  
    }  
    public static void main(String[] args)throws InterruptedException {  
        // TODO Auto-generated method stub  
        TestNew ta = new TestNew();  
        ta.start();  
        ta.join();  
        System.out.println(String.valueOf(a));  
    }  
}

 執(zhí)行結(jié)果:5。ta線程執(zhí)行完畢后,才會(huì)開始打印a。如果沒有join(),則結(jié)果不一定是5,原因是ta線程跟main線程的執(zhí)行順序并不固定。
(4)wait()與notify()方法:wait()方法同樣可以使線程進(jìn)行掛起操作,調(diào)用了wait()方法的線程進(jìn)入了“非可執(zhí)行”狀態(tài),使用wait()方法有兩種方式,例如:
thread.wait(1000);
或:
thread.wait();
thread.notify();
其中第一種方式給定線程掛起時(shí)間,基本上與sleep()方法用法相同。第二種方式是wait()與notify()方法配合使用,這種方式讓wait()方法無限等下去,直到線程接收到notify()或notifyAll()消息為止。
     wait()、notify()、notifyAll()不同于其他線程方法,這3個(gè)方法是java.lang.Object類的一部分,所以在定義自己類時(shí)會(huì)繼承下來。wait()、notify()、notifyAll()都被聲明為final類,所以無法重新定義。
(5)suspend()與resume()方法
       有時(shí)更好地掛起方法是強(qiáng)制掛起線程,而不是為線程指定休眠時(shí)間,這種情況下由其他線程負(fù)責(zé)喚醒其繼續(xù)執(zhí)行,除了wait()與notify()方法之外,線程中還有一對(duì)方法用于完成此功能,這就是suspend()與resume()方法。thread.suspend();thread.resume(),線程thread在運(yùn)行到suspend()之后被強(qiáng)制掛起,暫停運(yùn)行,直到主線程調(diào)用thread.resume()方法時(shí)才被重新喚醒。
      Java2中已經(jīng)廢棄了suspend()和resume()方法,因?yàn)槭褂眠@兩個(gè)方法可能會(huì)產(chǎn)生死鎖,所以應(yīng)該使用同步對(duì)象調(diào)用wait()和notify()的機(jī)制來代替suspend()和resume()進(jìn)行線程控制。

發(fā)佈手記

熱門詞條