Java 線(xiàn)程運(yùn)行

   /**
     * Causes this thread to begin execution; the Java Virtual Machine
     * calls the <code>run</code> method of this thread.
     * <p>
     * The result is that two threads are running concurrently: the
     * current thread (which returns from the call to the
     * <code>start</code> method) and the other thread (which executes its
     * <code>run</code> method).
     * <p>
     * It is never legal to start a thread more than once.
     * In particular, a thread may not be restarted once it has completed
     * execution.
     *
     * @exception  IllegalThreadStateException  if the thread was already
     *               started.
     * @see        #run()
     * @see        #stop()
     */
    public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }

Thread中的start()方法

注解很明確地說(shuō)明,該方法讓新創(chuàng)建的線(xiàn)程運(yùn)行,java虛擬機(jī)會(huì)調(diào)用thread的run方法。調(diào)用start()的結(jié)果是會(huì)有兩個(gè)線(xiàn)程在同時(shí)運(yùn)行,當(dāng)前線(xiàn)程是從start()方法的調(diào)用處返回,另一個(gè)線(xiàn)程執(zhí)行他的run方法。永遠(yuǎn)不允許start一個(gè)線(xiàn)程兩次,多次start將會(huì)報(bào)出"java.lang.IllegalThreadStateException”異常。尤其,一旦一個(gè)線(xiàn)程已經(jīng)完成了執(zhí)行,他將不會(huì)重啟。
這個(gè)方法不會(huì)被由虛擬機(jī)創(chuàng)建/設(shè)置的主線(xiàn)程或者系統(tǒng)組線(xiàn)程喚起。將來(lái),添加到這個(gè)方法里的功能都要被添加到虛擬機(jī)中。0狀態(tài)相當(dāng)于"NEW"狀態(tài)。</br>
1.首先判斷這個(gè)線(xiàn)程的狀態(tài)是否是零,如果不是則報(bào)錯(cuò)。</br>
2.將這個(gè)線(xiàn)程加入到線(xiàn)程組中 group.add(this) 通知線(xiàn)程組這個(gè)線(xiàn)程即將被啟動(dòng),所以這個(gè)線(xiàn)程可以被添加到線(xiàn)程組線(xiàn)程列表中,并且線(xiàn)程組沒(méi)有啟動(dòng)的現(xiàn)場(chǎng)數(shù)需要減少。在線(xiàn)程初始化init中,“g.addUnstarted();”增加了線(xiàn)程組未啟動(dòng)的線(xiàn)程數(shù),在這里需要將他減去。</br>
3.調(diào)用start0(),如果沒(méi)有異常則started狀態(tài)被置為true,否則將這個(gè)線(xiàn)程加入到線(xiàn)程組啟動(dòng)失敗的列表中。</br>

group.threadStartFailed(this) 移除線(xiàn)程并且未啟動(dòng)線(xiàn)程數(shù)+1</br>

   void threadStartFailed(Thread t) {
        synchronized(this) {
            remove(t);
            nUnstartedThreads++;
        }
    }

start0()方法在Thread源碼

private native void start0();
registerNatives.png

registerNatives()方法主要的作用就是注冊(cè)一些本地方法供 Thread 類(lèi)使用,如 start0(),stop0() 等等,可以說(shuō),所有操作本地線(xiàn)程的本地方法都是由它注冊(cè)的。這個(gè)方法放在一個(gè) static 語(yǔ)句塊中,這就表明,當(dāng)該類(lèi)被加載到 JVM 中的時(shí)候,它就會(huì)被調(diào)用,進(jìn)而注冊(cè)相應(yīng)的本地方法。
</br>
Java Thread:揭開(kāi)Run方法被調(diào)用的真正面紗</br>
native方法 稱(chēng)為本地方法。在java源程序中以關(guān)鍵字“native”聲明,不提供函數(shù)體。其實(shí)現(xiàn)使用C/C++語(yǔ)言在另外的文件中編寫(xiě),編寫(xiě)的規(guī)則遵循Java本地接口的規(guī)范Java native Interface(簡(jiǎn)稱(chēng)JNI)。簡(jiǎn)而言就是Java中聲明的可調(diào)用的使用C/C++實(shí)現(xiàn)的方法</br>

native關(guān)鍵字

標(biāo)識(shí)符native可以與所有其它的java標(biāo)識(shí)符連用,但是abstract除外。這是合理的,因?yàn)閚ative暗示這些方法是有實(shí)現(xiàn)體的,只不過(guò)這些實(shí)現(xiàn)體是非java的,但是abstract卻顯然的指明這些方法無(wú)實(shí)現(xiàn)體.</p>
一個(gè)native method方法可以返回任何java類(lèi)型,包括非基本類(lèi)型,而且同樣可以進(jìn)行異常控制。這些方法的實(shí)現(xiàn)體可以制一個(gè)異常并且將其拋出,這一點(diǎn)與java的方法非常相似。當(dāng)一個(gè)native method接收到一些非基本類(lèi)型時(shí)如Object或一個(gè)整型數(shù)組時(shí),這個(gè)方法可以訪(fǎng)問(wèn)這非些基本型的內(nèi)部,但是這將使這個(gè)native方法依賴(lài)于你所訪(fǎng)問(wèn)的java類(lèi)的實(shí)現(xiàn)。有一點(diǎn)要牢牢記住:我們可以在一個(gè)native method的本地實(shí)現(xiàn)中訪(fǎng)問(wèn)所有的java特性,但是這要依賴(lài)于你所訪(fǎng)問(wèn)的java特性的實(shí)現(xiàn),而且這樣做遠(yuǎn)遠(yuǎn)不如在java語(yǔ)言中使用那些特性方便和容易。</p>
native method的存在并不會(huì)對(duì)其他類(lèi)調(diào)用這些本地方法產(chǎn)生任何影響,實(shí)際上調(diào)用這些方法的其他類(lèi)甚至不知道它所調(diào)用的是一個(gè)本地方法。JVM將控制調(diào)用本地方法的所有細(xì)節(jié)。需要注意當(dāng)我們將一個(gè)本地方法聲明為final的情況。用java實(shí)現(xiàn)的方法體在被編譯時(shí)可能會(huì)因?yàn)閮?nèi)聯(lián)而產(chǎn)生效率上的提升。但是一個(gè)native final方法是否也能獲得這樣的好處卻是值得懷疑的,但是這只是一個(gè)代碼優(yōu)化方面的問(wèn)題,對(duì)功能實(shí)現(xiàn)沒(méi)有影響。</p>
如果一個(gè)含有本地方法的類(lèi)被繼承,子類(lèi)會(huì)繼承這個(gè)本地方法并且可以用java語(yǔ)言重寫(xiě)這個(gè)方法(這個(gè)似乎看起來(lái)有些奇怪),同樣的如果一個(gè)本地方法被final標(biāo)識(shí),它被繼承后不能被重寫(xiě)。</p>
本地方法非常有用,因?yàn)樗行У財(cái)U(kuò)充了JVM .事實(shí)上,我們所寫(xiě)的java代碼已經(jīng)用到了本地方法,在sun的java的并發(fā)(多線(xiàn)程)的機(jī)制實(shí)現(xiàn)中,許多與操作系統(tǒng)的接觸點(diǎn)都用到了本地方法,這得java程序能夠超越j(luò)ava運(yùn)行時(shí)的界限。有了本地方法,java程序可以做任何應(yīng)用層次的任務(wù)。</p>

synchronized關(guān)鍵字

start()方法用synchronized修飾,即這個(gè)方法就是同步方法,他鎖定的是調(diào)用這個(gè)同步方法對(duì)象。</br>
Java的synchronized關(guān)鍵字:同步機(jī)制總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,765評(píng)論 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工...
    ZaneInTheSun閱讀 2,687評(píng)論 0 11
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂(lè)視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,366評(píng)論 11 349
  • Java-Review-Note——4.多線(xiàn)程 標(biāo)簽: JavaStudy PS:本來(lái)是分開(kāi)三篇的,后來(lái)想想還是整...
    coder_pig閱讀 1,677評(píng)論 2 17
  • 太陽(yáng)和我鬧 把我曬冒泡 我氣把泡消 心外似火燒
    伊薩閱讀 224評(píng)論 19 25