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

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

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

    yeshucheng
    追逐自己,追逐方向,心隨悟所動
    posts - 24,comments - 24,trackbacks - 0
     

    線程,是指正在執(zhí)行的一個指點令序列。在java平臺上是指從一個線程對象的start()開始。運行run方法體中的那一段相對獨立的過程。

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

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

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

    JAVA線程對象

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

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

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

    注意:線程對象和線程是兩個截然不同的概念。

    線程對象JVM產(chǎn)生的一個普通的Object子類

    線程是CPU分配給這個對象的一個運行過程

    public class Test {

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

        MyThread mt = new MyThread();

        mt.start();

        mt.join();

        Thread.sleep(3000);

        mt.start();

     }

    }

    當線程對象mt運行完成后,我們讓主線程休息一下,然后我們再次在這個線程對象上啟動線程.結果我們看到:

    Exception in thread "main" java.lang.IllegalThreadStateException

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

    public synchronized void start() {

            if (started)
                throw new IllegalThreadStateException();

            started = true;

           group.add(this);

            start0();

     }

    一個Thread的實例一旦調(diào)用start()方法,這個實例的started標記就標記為true,事實中不管這個線程后來有沒有執(zhí)行到底,只要調(diào)用了一次start()就再也沒有機會運行了,這意味著:

    【通過Thread實例的start(),一個Thread的實例只能產(chǎn)生一個線程】

    interrupt()方法

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

    join()方法

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

    例如:有兩個工作,工作A要耗時10秒鐘,工作B要耗時10秒或更多。我們在程序中先生成一個線程去做工作B,然后做工作A

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

    A();//做工作A

    工作A完成后,下面要等待工作B的結果來進行處理。如果工作B還沒有完成我就不能進行下面的工作C,所以:

    B b = new B();

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

    A();//做工作A

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

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

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

    yield()方法

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

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

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

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

    線程的互斥控制

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

    synchornized關鍵字

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

    例如:

    synchronized(obj){

                     //todo…

    }

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

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

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

     

    真正的停止線程

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

    1.     正常運行;

    2.       處理結束前的工作,也就是準備結束;

    3.       結束退出。

    注:以上部分概括出自某位牛人大哥的筆記,經(jīng)常拜讀他的博客
    posted on 2009-07-20 10:00 葉澍成 閱讀(393) 評論(0)  編輯  收藏 所屬分類: java基礎
    主站蜘蛛池模板: 91精品国产免费入口| 日韩免费视频在线观看| 亚洲日韩精品一区二区三区 | 59pao成国产成视频永久免费| 国产成人免费高清在线观看| 亚洲小说图区综合在线| 免费可以在线看A∨网站| 亚洲无人区码一二三码区别图片| 免费H网站在线观看的| 亚洲第一男人天堂| 永久久久免费浮力影院| mm1313亚洲国产精品无码试看| 国产一级做a爱免费视频| 成年大片免费高清在线看黄| 中文字幕亚洲激情| 精品四虎免费观看国产高清午夜| 久久久久亚洲AV无码网站| 99爱在线精品免费观看| 亚洲AV无码男人的天堂| 免费在线不卡视频| 成av免费大片黄在线观看| 91情国产l精品国产亚洲区| 亚洲成人免费电影| 亚洲av午夜电影在线观看| 亚洲电影免费观看| www.亚洲日本| 免费va人成视频网站全| 中文无码日韩欧免费视频| 亚洲第一永久在线观看| 日韩免费视频网站| 国内精品久久久久影院免费| 亚洲国产精品美女| 亚洲国产成人久久综合野外| 久久精品成人免费网站| 亚洲日本VA午夜在线电影| 国产亚洲精品免费视频播放| 国产成人精品久久免费动漫| 四虎影视久久久免费观看| 亚洲精品欧洲精品| 亚洲视频一区二区| 免费观看黄网站在线播放|