Java併發是什麼?

Java是一種多線程編程語言,我們可以使用Java來開發多線程程序。 多線程程序包含兩個或多個可同時運行的部分,每個部分可以同時處理不同的任務,從而能更好地利用可用資源,特別是當您的計算機有多個CPU時。多線程使您能夠寫入多個活動,可以在同一程序中同時進行操作處理。

根據定義,多任務是當多個進程共享,如CPU處理公共資源。 多線程將多任務的概念擴展到可以將單個應用程序中的特定操作細分爲單個線程的應用程序。每個線程可以並行運行。 操作系統不僅在不同的應用程序之間劃分處理時間,而且在應用程序中的每個線程之間劃分處理時間。

多線程能夠在同一程序同中,進行多個活動的方式進行寫入。

線程的生命週期

線程在其生命週期中經歷各個階段。 例如,線程誕生,啓動,運行,然後死亡。 下圖顯示了線程的完整生命週期。

Java併發是什麼?

以下是線程生命週期的階段 -

  • 新線程(New) - 新線程在新的狀態下開始其生命週期。直到程序啓動線程爲止,它保持在這種狀態。它也被稱爲出生線程

  • 可運行(Runnable) - 新誕生的線程啓動後,該線程可以運行。狀態的線程被認爲正在執行其任務。

  • 等待(Waiting) - 有時,線程會轉換到等待狀態,而線程等待另一個線程執行任務。 只有當另一個線程發信號通知等待線程才能繼續執行時,線程才轉回到可運行狀態。

  • 定時等待(Timed Waiting) - 可運行的線程可以在指定的時間間隔內進入定時等待狀態。 當該時間間隔到期或發生等待的事件時,此狀態的線程將轉換回可運行狀態。

  • 終止(Dead) - 可執行線程在完成任務或以其他方式終止時進入終止狀態。

線程優先級

每個Java線程都有一個優先級,可以幫助操作系統確定安排線程的順序。Java線程優先級在MIN_PRIORITY(常數爲1)和MAX_PRIORITY(常數爲10)之間的範圍內。 默認情況下,每個線程都被賦予優先級NORM_PRIORITY(常數爲5)。

具有較高優先級的線程對於一個程序來說更重要,應該在低優先級線程之前分配處理器時間。 然而,線程優先級不能保證線程執行的順序,並且依賴於平臺。

通過實現Runnable接口創建一個線程

如果想讓一個類作爲線程執行,那麼您可以通過實現Runnable接口來實現此目的。 您將需要遵循三個基本步驟 -

第1步

在第一步中,您需要實現由Runnable接口提供的run()方法。 該方法爲線程提供了一個入口點,您可將把完整的業務邏輯放在此方法中。 以下是run()方法的簡單語法 -

public void run( )

第2步

在第二步中,您將使用以下構造函數實例化一個Thread對象 -

Thread(Runnable threadObj, String threadName);

其中,threadObj是實現Runnable接口的類的實例,threadName是給予新線程的名稱。

第3步

當創建了一個線程對象,可以通過調用start()方法啓動它,該方法執行對run()方法的調用。 以下是一個簡單的語法start()方法 -

void start();

實例

這是一個創建一個新線程並開始運行的示例 -

class RunnableDemo implements Runnable {
   private Thread t;
   private String threadName;

   RunnableDemo( String name) {
      threadName = name;
      System.out.println("Creating " +  threadName );
   }

   public void run() {
      System.out.println("Running " +  threadName );
      try {
         for(int i = 4; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
            // Let the thread sleep for a while.
            Thread.sleep(50);
         }
      }catch (InterruptedException e) {
         System.out.println("Thread " +  threadName + " interrupted.");
      }
      System.out.println("Thread " +  threadName + " exiting.");
   }

   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class TestThread {

   public static void main(String args[]) {
      RunnableDemo R1 = new RunnableDemo( "Thread-1");
      R1.start();

      RunnableDemo R2 = new RunnableDemo( "Thread-2");
      R2.start();
   }   
}

這將產生以下結果 -

Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread: Thread-1, 4
Running Thread-2
Thread: Thread-2, 4
Thread: Thread-1, 3
Thread: Thread-2, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-1, 1
Thread: Thread-2, 1
Thread Thread-1 exiting.
Thread Thread-2 exiting.

通過擴展Thread類創建一個線程

創建線程的第二種方法是創建一個新類,使用以下兩個簡單的步驟來擴展Thread類。 這種方法在處理使用Thread類中可用的方法創建的多個線程時提供了更多的靈活性。

第1步

需要覆蓋Thread類中的run()方法。 該方法爲線程提供了一個入口點,您將把完整的業務邏輯放在此方法中。 以下是run()方法的簡單語法 -

public void run( )

第2步

當創建了Thread對象,您可以通過調用start()方法啓動它,該方法執行對run()方法的調用。以下是一個簡單的語法start()方法 -

void start( );

示例

這是上面示例程序中重寫擴展Thread代碼如下 -

class ThreadDemo extends Thread {
   private Thread t;
   private String threadName;

   ThreadDemo( String name) {
      threadName = name;
      System.out.println("Creating " +  threadName );
   }

   public void run() {
      System.out.println("Running " +  threadName );
      try {
         for(int i = 4; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
            // Let the thread sleep for a while.
            Thread.sleep(50);
         }
      }catch (InterruptedException e) {
         System.out.println("Thread " +  threadName + " interrupted.");
      }
      System.out.println("Thread " +  threadName + " exiting.");
   }

   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class TestThread {

   public static void main(String args[]) {
      ThreadDemo T1 = new ThreadDemo( "Thread-1");
      T1.start();

      ThreadDemo T2 = new ThreadDemo( "Thread-2");
      T2.start();
   }   
}

運行上面代碼,這將產生以下結果 -

Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread: Thread-1, 4
Running Thread-2
Thread: Thread-2, 4
Thread: Thread-1, 3
Thread: Thread-2, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-1, 1
Thread: Thread-2, 1
Thread Thread-1 exiting.
Thread Thread-2 exiting.