<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yeshucheng
    追逐自己,追逐方向,心隨悟所動(dòng)
    posts - 24,comments - 24,trackbacks - 0
     

    線程,是指正在執(zhí)行的一個(gè)指點(diǎn)令序列。在java平臺(tái)上是指從一個(gè)線程對(duì)象的start()開(kāi)始。運(yùn)行run方法體中的那一段相對(duì)獨(dú)立的過(guò)程。

    線程的并發(fā)與并行

    在過(guò)去的電腦都已單CPU作為主要的處理方式,無(wú)論是PC或者是服務(wù)器都是如此。系統(tǒng)調(diào)用某一個(gè)時(shí)刻只能有一個(gè)線程運(yùn)行。當(dāng)然這當(dāng)中采用了比較多的策略來(lái)做時(shí)間片輪詢(xún)。通過(guò)不斷的調(diào)度切換來(lái)運(yùn)行線程運(yùn)行,而這種方式就叫做并發(fā)(concurrent)。

    隨著工藝水平的逐漸提升,CPU的技術(shù)也在不斷增進(jìn)。因此在如今多個(gè)CPU已經(jīng)不是什么特別的,而大家常常以SMP的方式來(lái)形容多個(gè)CPU來(lái)處理兩個(gè)或者兩個(gè)以上的線程運(yùn)行方式就稱(chēng)為并行(parallel)。

    JAVA線程對(duì)象

                                              繼承Thread,實(shí)現(xiàn)start()方法

    要實(shí)現(xiàn)線程運(yùn)行,JAVA中有兩種方式:

                                          實(shí)現(xiàn)Runnable,然后再傳遞給Thread實(shí)例

    注意:線程對(duì)象和線程是兩個(gè)截然不同的概念。

    線程對(duì)象JVM產(chǎn)生的一個(gè)普通的Object子類(lèi)

    線程是CPU分配給這個(gè)對(duì)象的一個(gè)運(yùn)行過(guò)程

    public class Test {

     public static void main(String[] args) throws Exception{

        MyThread mt = new MyThread();

        mt.start();

        mt.join();

        Thread.sleep(3000);

        mt.start();

     }

    }

    當(dāng)線程對(duì)象mt運(yùn)行完成后,我們讓主線程休息一下,然后我們?cè)俅卧谶@個(gè)線程對(duì)象上啟動(dòng)線程.結(jié)果我們看到:

    Exception in thread "main" java.lang.IllegalThreadStateException

    根本原因是在以下源代碼中找出:

    public synchronized void start() {

            if (started)
                throw new IllegalThreadStateException();

            started = true;

           group.add(this);

            start0();

     }

    一個(gè)Thread的實(shí)例一旦調(diào)用start()方法,這個(gè)實(shí)例的started標(biāo)記就標(biāo)記為true,事實(shí)中不管這個(gè)線程后來(lái)有沒(méi)有執(zhí)行到底,只要調(diào)用了一次start()就再也沒(méi)有機(jī)會(huì)運(yùn)行了,這意味著:

    【通過(guò)Thread實(shí)例的start(),一個(gè)Thread的實(shí)例只能產(chǎn)生一個(gè)線程】

    interrupt()方法

    當(dāng)一個(gè)線程對(duì)象調(diào)用interrupt()方法,它對(duì)應(yīng)的線程并沒(méi)有被中斷,只是改變了它的中斷狀態(tài)。使當(dāng)前線程的狀態(tài)變以中斷狀態(tài),如果沒(méi)有其它影響,線程還會(huì)自己繼續(xù)執(zhí)行。只有當(dāng)線程執(zhí)行到sleepwaitjoin等方法時(shí),或者自己檢查中斷狀態(tài)而拋出異常的情況下,線程才會(huì)拋出異常。

    join()方法

    join()方法,正如第一節(jié)所言,在一個(gè)線程對(duì)象上調(diào)用join方法,是當(dāng)前線程等待這個(gè)線程對(duì)象對(duì)應(yīng)的線程結(jié)束

    例如:有兩個(gè)工作,工作A要耗時(shí)10秒鐘,工作B要耗時(shí)10秒或更多。我們?cè)诔绦蛑邢壬梢粋€(gè)線程去做工作B,然后做工作A

            new B().start();//做工作B

    A();//做工作A

    工作A完成后,下面要等待工作B的結(jié)果來(lái)進(jìn)行處理。如果工作B還沒(méi)有完成我就不能進(jìn)行下面的工作C,所以:

    B b = new B();

    b.start();//做工作B

    A();//做工作A

    b.join();//等工作B完成.

    C();//繼續(xù)工作C

    原則:【join是測(cè)試其它工作狀態(tài)的唯一正確方法】

    yield()方法

    yield()方法也是類(lèi)方法,只在當(dāng)前線程上調(diào)用,理由同上,它主是讓當(dāng)前線程放棄本次分配到的時(shí)間片,調(diào)用這個(gè)方法不會(huì)提高任何效率,只是降低了CPU的總周期上面介紹的線程一些方法,基于(基礎(chǔ)篇)而言只能簡(jiǎn)單提及。以后具體應(yīng)用中我會(huì)結(jié)合實(shí)例詳細(xì)論述。

    原則:【不是非常必要的情況下,沒(méi)有理由調(diào)用它】

    wait()notify()/notityAll()方法

    首先明確一點(diǎn)他們的屬于普通對(duì)象方法,并非是線程對(duì)象方法;其次它們只能在同步方法中調(diào)用。線程要想調(diào)用一個(gè)對(duì)象的wait()方法就要先獲得該對(duì)象的監(jiān)視鎖,而一旦調(diào)用wait()后又立即釋放該鎖。

    線程的互斥控制

    多個(gè)線程同時(shí)操作某一對(duì)象時(shí),一個(gè)線程對(duì)該對(duì)象的操作可能會(huì)改變其狀態(tài),而該狀態(tài)會(huì)影響另一線程對(duì)該對(duì)象的真正結(jié)果。

    synchornized關(guān)鍵字

    把一個(gè)單元聲明為synchornized,就可以讓在同一時(shí)間只有一個(gè)線程操作該方法。作為記憶可以把synchronized看作是一個(gè)鎖。但是我們要理解鎖是被動(dòng)的,還是主動(dòng)的呢?換而言之它到底鎖什么了?鎖誰(shuí)了?

    例如:

    synchronized(obj){

                     //todo…

    }

    如果代碼運(yùn)行到此處,synchronized首先獲取obj參數(shù)對(duì)象的鎖,若沒(méi)有獲取線程只能等待,如果多個(gè)線程運(yùn)行到這只能有一個(gè)線程獲取obj的鎖,然后再執(zhí)行{}中的代碼。因此obj作用范圍不同,控制程序也不同。

    如果一個(gè)方法聲明為synchornized的,則等同于把在為個(gè)方法上調(diào)用synchornized(this)

    如果一個(gè)靜態(tài)方法被聲明為synchornized,則等同于把在為個(gè)方法上調(diào)用synchornized(類(lèi).class)

     

    真正的停止線程

    要讓一個(gè)線程得到真正意義的停止,需要了解當(dāng)前的線程在干什么,如果線程當(dāng)前沒(méi)有做什么,那立刻讓對(duì)方退出,當(dāng)然是沒(méi)有任何問(wèn)題,但是如果對(duì)方正在手頭趕工,那就必須讓他停止,然后收拾殘局。因此,首先需要了解步驟:

    1.     正常運(yùn)行;

    2.       處理結(jié)束前的工作,也就是準(zhǔn)備結(jié)束;

    3.       結(jié)束退出。

    注:以上部分概括出自某位牛人大哥的筆記,經(jīng)常拜讀他的博客
    posted on 2009-07-20 10:00 葉澍成 閱讀(387) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): java基礎(chǔ)
    主站蜘蛛池模板: 四虎影视在线永久免费看黄| 久久aⅴ免费观看| 岛国大片免费在线观看| 亚洲黄色网址在线观看| 久久精品免费一区二区三区| 亚洲午夜国产片在线观看| 黄色网页免费观看| 免费一级毛片清高播放| 国产在线国偷精品产拍免费| 免费看又黄又爽又猛的视频软件| 大陆一级毛片免费视频观看| 亚洲mv国产精品mv日本mv| 亚洲欧美aⅴ在线资源| 99精品全国免费观看视频..| 国产成人亚洲综合无码| a级毛片免费全部播放无码| 亚洲天天做日日做天天欢毛片 | 国产片免费福利片永久| j8又粗又长又硬又爽免费视频| 国产精品亚洲二区在线观看| 免费黄网站在线观看| 亚洲中文字幕在线无码一区二区| 日本免费中文字幕在线看| 国产福利电影一区二区三区,免费久久久久久久精 | 四虎国产精品免费永久在线| 久久久久亚洲AV无码专区首JN| 一二三四在线播放免费观看中文版视频| 亚洲一区在线观看视频| 亚洲精品国产电影| 亚州免费一级毛片| 九九免费精品视频在这里| 亚洲av中文无码乱人伦在线播放| 岛国av无码免费无禁网站| A级毛片高清免费视频在线播放| 国产zzjjzzjj视频全免费| 久久国产精品成人免费| 欧美色欧美亚洲另类二区| 亚洲精品免费在线| 亚洲综合伊人久久综合| 国产精品成人无码免费| 青青在线久青草免费观看|