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

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

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

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

         run() 和start() 是大家都很熟悉的兩個方法。把希望并行處理的代碼都放在run() 中;stat() 用于自動調(diào)用run(),這是Java的內(nèi)在機(jī)制規(guī)定的。當(dāng)一個線程進(jìn)入“非可執(zhí)行”狀態(tài),必然存在某種原因使其不能繼續(xù)運行,這些原因可能是如下幾種情況:
     A,通過調(diào)用sleep()方法使線程進(jìn)入休眠狀態(tài),線程在指定時間內(nèi)不會運行。
     B,通過調(diào)用join()方法使線程掛起,如果某個線程在另一個線程t上調(diào)用t.join(),這個線程將被掛起,直到線程t執(zhí)行完畢為止。
     C,通過調(diào)用wait()方法使線程掛起,直到線程得到了notify()和notifyAll()消息,線程才會進(jìn)入“可執(zhí)行”狀態(tài)。
(2)sleep()方法:是一個使線程暫時停止一段執(zhí)行時間的方法,該時間由給定的毫秒數(shù)決定。下面演示一個使用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。有人會提出疑問:ta.sleep(5000);這個語句是ta線程睡眠了5秒,為什么執(zhí)行結(jié)果是main這個主線程也睡眠了5秒?兩者是兩個獨立的線程才對?原因是:在哪個線程里聲明sleep,哪個線程睡眠,所以是主線程睡眠了5000毫秒=5秒。

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

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í)行完畢后,才會開始打印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();
其中第一種方式給定線程掛起時間,基本上與sleep()方法用法相同。第二種方式是wait()與notify()方法配合使用,這種方式讓wait()方法無限等下去,直到線程接收到notify()或notifyAll()消息為止。
     wait()、notify()、notifyAll()不同于其他線程方法,這3個方法是java.lang.Object類的一部分,所以在定義自己類時會繼承下來。wait()、notify()、notifyAll()都被聲明為final類,所以無法重新定義。
(5)suspend()與resume()方法
       有時更好地掛起方法是強(qiáng)制掛起線程,而不是為線程指定休眠時間,這種情況下由其他線程負(fù)責(zé)喚醒其繼續(xù)執(zhí)行,除了wait()與notify()方法之外,線程中還有一對方法用于完成此功能,這就是suspend()與resume()方法。thread.suspend();thread.resume(),線程thread在運行到suspend()之后被強(qiáng)制掛起,暫停運行,直到主線程調(diào)用thread.resume()方法時才被重新喚醒。
      Java2中已經(jīng)廢棄了suspend()和resume()方法,因為使用這兩個方法可能會產(chǎn)生死鎖,所以應(yīng)該使用同步對象調(diào)用wait()和notify()的機(jī)制來代替suspend()和resume()進(jìn)行線程控制。

Notes de version

Entrées populaires