Java並行是什麼?


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

根據定義,多工是當多個進程共用,如CPU處理公共資源。 多執行緒將多工的概念擴充套件到可以將單個應用程式中的特定操作細分為單個執行緒的應用程式。每個執行緒可以並行執行。 作業系統不僅在不同的應用程式之間劃分處理時間,而且在應用程式中的每個執行緒之間劃分處理時間。

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

執行緒的生命週期

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

以下是執行緒生命週期的階段 -

  • 新執行緒(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.