<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Java 線程教程 > 原文: [https://javabeginnerstutorial.com/core-java-tutorial/java-thread-tutorial/](https://javabeginnerstutorial.com/core-java-tutorial/java-thread-tutorial/) 可以以兩種方式使用線程術語 * 類`java.lang.Thread`的實例 * 執行線程 線程的*實例*是一個對象,與 Java 中的其他任何對象一樣,它包含在堆上生存和死亡的變量和方法。 但是*執行線程*是一個單獨的進程,具有其*棧*調用。 即使您沒有在程序中創建任何線程,一個線程也將在其中運行,然后`main()`方法將啟動該線程。 **注意**:如果是線程,大多數事情都是不可預測的。 ## 線程類型 線程可以是兩種類型。 * 用戶線程 * 守護程序線程 這兩類線程之間的區別在于,JVM 僅在所有用戶線程完成時才退出應用。 JVM 并不關心守護線程的狀態。 ## 線程定義 可以通過兩種方式定義線程 * 擴展`java.lang.Thread`類。 * 實現`Runnable`接口。 ### 擴展 Java 線程類: 該類需要**擴展**,**線程**類并覆蓋`run()`方法。 ```java class MyThread extends Thread { public void run() { System.out.println("Important job running in MyThread"); } } ``` 但是這種方法的問題是類不能再擴展任何類。 > 線程的`run()`方法可以在類中重載。 但是,JVM 僅考慮`run()`方法(不帶參數)。 任何其他覆蓋的方法都需要顯式調用。 ### 實現`Runnable`接口 該類需要實現`Runnable`接口,并且覆蓋`run()`方法。以這種方式創建線程使您可以靈活地擴展所需的任何類。 ```java class MyRunnable implements Runnable { public void run() { System.out.println("Important job running in MyRunnable"); } } ``` ### 實例化線程: 每個執行線程都以`Thread`類的實例開始。 無論如何,都需要在創建執行線程之前創建線程對象。 兩種情況下創建線程對象均不同。 如果擴展了`Thread`類,則可以使用`new`關鍵字直接啟動類,因為它已經擴展了`Thread`類本身。 ```java MyThread t = new MyThread() ``` 如果實現`Runnable`接口。 首先創建的可運行類需要實例化。 ```java MyRunnable r = new MyRunnable(); ``` 現在將此可運行對象傳遞給`Thread`。 ```java Thread t = new Thread(r); ``` 如果使用無參構造器創建線程,則該線程將調用其自己的`run()`。 這是在第一種情況下發生的(擴展`Thread`類),但是在`Runnable`的情況下,需要知道實現了`Runnable`接口的類的`run`方法需要被調用,而不是`Thread`類的`run()`。 因此,我們需要將該類作為參數傳遞給`Thread`。 單個可運行實例可以傳遞給多個`Thread`對象。 ```java public class TestThreads { public static void main (String [] args) { MyRunnable r = new MyRunnable(); Thread foo = new Thread(r); Thread bar = new Thread(r); Thread bat = new Thread(r); }} ``` 將相同的目標分配給多個線程意味著多個執行線程將運行同一作業(并且同一作業將執行多次)。 > `Thread`類本身實現了`Runnable`。 (畢竟,它有一個我們要覆蓋的`run()`方法。)這意味著您可以將`Thread`傳遞給另一個`Thread`的構造器。 ## `Thread`類中的重載構造器: ```java Thread() Thread(Runnable target) Thread(Runnable target, String name) Thread(String name) ``` 到目前為止,我們已經創建了一個`Thread`對象,并且它知道以`run()`方法的形式做什么。 但是到目前為止,它仍然是一個對象。 它沒有調用棧。 換句話說,執行線程尚未啟動。 僅當在線程上調用`start()`方法時,線程對象才會具有其棧。 到目前為止,線程具有兩種狀態。 * 新狀態(已創建線程對象,但未調用`Start`方法) * 可運行(活動)狀態(調用啟動方法) > 直接從 Java 代碼調用`run()`方法意味著您正在調用方法,并且不會創建棧。 當線程處于可運行狀態時,表示已創建線程,但尚未執行該線程的`run`方法,并且該線程正在等待輪到他。 選定線程后,線程的`run`方法將執行,該狀態稱為運行狀態。 **線程調度器**: 線程調度器是 JVM 的一部分,它決定在任何給定的時間應該運行哪個線程,并使線程退出運行狀態 。 調度器可以選擇任何處于可運行狀態的線程作為唯一正在運行的線程。 如果線程不處于可運行狀態,則不能將其選擇為當前正在運行的線程。 某種可能在某種程度上影響調度器的方法(**注**:我們無法控制線程調度器的行為) **這些方法來自線程類** ```java * public static void sleep(long millis) throws InterruptedException * public static void yield() * public final void join() throws InterruptedException * public final void setPriority(int newPriority) ``` **`Object`類中的方法。** ```java * public final void wait() throws InterruptedException * public final void notify() * public final void notifyAll() ``` 到目前為止,我們遇到了線程的三種狀態 * 新建 * 可運行的 * 正在運行 線程還有更多狀態,線程將無法運行。 * 等待/阻止/睡眠 * 死亡 當線程的`run`方法完成執行時,該線程處于死亡狀態。 `sleep()`:`sleep()`方法是`Thread`類的靜態方法。 (它仍然必須乞求成為當前正在運行的線程)。 由于它僅在當前是靜態方法,因此運行`Thread`將進入睡眠狀態。 語法為:`Thread.sleep()` **`yield()`**:`yield`方法與`Thread`的優先級相關。 這也是一個靜態方法,因此它僅適用于當前正在運行的線程。 調度器確保如果線程進入可運行狀態,并且其優先級高于池中的任何線程,并且具有比當前正在運行的線程更高的優先級,則優先級較低的運行線程通常會被撞回可運行狀態,然后將選擇優先級最高的線程來運行。 在任何給定時間,當前正在運行的線程通常不會具有低于池中任何線程的優先級。 `yield()`應該做的是使當前正在運行的線程回到可運行狀態,以允許具有相同優先級的其他線程輪流使用。 **`Join()`**:`Join`是一種非靜態方法。 它使一個線程“連接到另一線程的末端”。 如果將線程 B 連接線程 A,則直到線程 A 完成,線程 B 才會啟動。 **語法**: ```java Thread t = new Thread(); t.start(); t.join(); ``` 接收當前正在運行的線程,并將其連接到`t`引用的線程的末尾 線程可以離開運行狀態并返回到`Runnable`狀態的其他幾種方法。 運行方法完成對`wait()`的調用 **同步**:與鎖一起使用。 鎖有兩種類型。 **靜態鎖定** **非靜態鎖定** > 每個對象只有一個鎖。 一旦線程獲得了對象的鎖,其他線程就無法進入給定對象的同步塊/方法。 + 僅方法/塊可以同步,而不是變量或類。 + 一個類可以同時具有同步/同步方法。 + 即使一個線程獲得了給定對象的鎖,線程也可以訪問同步塊。 + 如果線程進入睡眠狀態,則它將擁有其擁有的所有鎖。 一個線程可以同時具有不同對象的鎖。 **語法**: ```java class SyncTest { public void doStuff() { System.out.println("not synchronized"); synchronized(this) { System.out.println("synchronized"); }}} ``` **同步靜態方法**: 靜態數據只有一個副本,因此每個類只需要一個鎖即可同步靜態方法,即整個類的鎖。 有這樣的鎖。 Java 中加載的每個類都有一個表示該類的`java.lang.Class`對應實例。 就是那個`java.lang.Class`實例,其鎖用于保護類的靜態方法。 **語法**: ```java public static synchronized int getCount() { return count; } ``` `MyClass.class`事物稱為類字面值。 它告訴編譯器(誰告訴 JVM):去找我代表代表`MyClass`類的類實例。 > 在同一類中調用非靜態同步方法的線程只有在使用同一實例調用它們時才會彼此阻塞。 由于每個實例只有一個鎖。 在同一類中調用靜態同步方法的線程將始終相互阻塞,因為每個類只有一個鎖。 靜態同步方法和非靜態同步方法不會相互阻塞。 由于他們需要為其他事物鎖定(對象&類) **注意**:`join()`,`sleep()`,`yield()`這些方法保持鎖定。 在等待釋放鎖定時。 ## 備忘單 * 可以通過*擴展線程類*并覆蓋`run()`方法來創建線程。 * 也可以通過以下方法創建線程:*實現`Runnable`接口*,然后調用帶有`Runnable`參數的`Thread`構造器。 * `start()`方法只能在線程對象*上調用一次*。 * 一旦在線程對象上調用`start()`方法,它將成為*執行線程。* 在調用`start()`方法之前,它被稱為處于新狀態,并且不處于活動狀態。 * 不能保證啟動后線程執行的順序。 * 我們可以通過設置`Thread`優先級(1-10)來影響`Thread`執行的順序。 * 正在運行的線程可以通過`wait()`,`sleep`或`join()`調用進入阻塞/等待狀態。 * 正在運行的線程可能無法獲取同步代碼塊的鎖,因此可能會進入阻止/等待狀態。 * 死線程無法再次啟動。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看