Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤與異常

Java 多執行緒

Java 同步

Java 網路

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 和框架

Java 類參考

Java 有用資源

Java - 執行緒連線



建立 Thread 物件後,可以透過呼叫 start() 方法 來啟動它,該方法會執行對 run() 方法 的呼叫。在多個執行緒執行的情況下,我們可以阻塞當前執行緒,直到另一個執行緒終止。

Java 中的執行緒連線

Java 中的執行緒連線是指等待(或阻塞)一個執行緒,直到另一個執行緒完成其執行。 Threadjoin() 方法用於此目的。

語法

以下是 join() 方法的簡單語法:

void join();

過載的 Thread.join() 方法

以下是三個過載的 join() 方法:

  • join() - 當前執行緒在第二個執行緒上呼叫此方法,導致當前執行緒阻塞,直到第二個執行緒終止。

  • join(long millisec) - 當前執行緒在第二個執行緒上呼叫此方法,導致當前執行緒阻塞,直到第二個執行緒終止或指定的毫秒數過去。

  • join(long millisec, int nanos) - 當前執行緒在第二個執行緒上呼叫此方法,導致當前執行緒阻塞,直到第二個執行緒終止或指定的毫秒數 + 納秒數過去。

Java 中執行緒連線的示例

在此示例中,我們透過實現 Runnable 介面建立一個 RunnableDemo 類。RunnableDemo 類具有 run() 方法的實現。在主類 TestThread 中,我們建立了 RunnableDemo 物件,並使用這些物件建立了兩個 Thread 物件。當在每個執行緒物件上呼叫 Thread.start() 方法時,執行緒開始處理並執行程式。使用 join() 方法,我們阻塞當前執行緒,以確保一旦一個執行緒完成,只有下一個執行緒才會啟動。

package com.tutorialspoint;

class RunnableDemo implements Runnable {
   RunnableDemo( ) {
      System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: New");
   }

   public void run() {
      System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
      for(int i = 4; i > 0; i--) {
         System.out.println("Thread: " + Thread.currentThread().getName() + ", " + i);         
      }
      System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
   }
}

public class TestThread {
   public static void main(String args[]) throws InterruptedException {
      Thread t1 = new Thread( new RunnableDemo(), "Thread-1");
      Thread t2 = new Thread( new RunnableDemo(), "Thread-2");
      Thread t3 = new Thread( new RunnableDemo(), "Thread-3");
      // start t1 thread and join main thread
      t1.start();
      t1.join();	  
      // t2 will start when t1 is dead
      t2.start();        
      t2.join();
      // t3 will start when t2 is dead
      t3.start();
   }
}

輸出

Thread: Thread-1, State: New
Thread: Thread-2, State: New
Thread: Thread-1, State: Running
Thread: Thread-1, 4
Thread: Thread-1, 3
Thread: Thread-1, 2
Thread: Thread-1, 1
Thread: Thread-1, State: Dead
Thread: Thread-2, State: Running
Thread: Thread-2, 4
Thread: Thread-2, 3
Thread: Thread-2, 2
Thread: Thread-2, 1
Thread: Thread-2, State: Dead

Java 中執行緒連線的更多示例

示例 1

在此示例中,我們透過實現 Runnable 介面建立一個 RunnableDemo 類。RunnableDemo 類具有 run() 方法的實現。在主類 TestThread 中,我們建立了 RunnableDemo 物件,並使用這些物件建立了兩個 Thread 物件。當在每個執行緒物件上呼叫 Thread.start() 方法時,執行緒開始處理並執行程式。使用 join(long millisec) 方法,我們將當前執行緒阻塞 200 毫秒,以確保一旦一個執行緒完成或延遲 200 毫秒後,只有下一個執行緒才會啟動。

package com.tutorialspoint;

class RunnableDemo implements Runnable {
   RunnableDemo( ) {
      System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: New");
   }

   public void run() {
      System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
      for(int i = 4; i > 0; i--) {
         try {
            Thread.sleep(50);
         } catch (InterruptedException e) {
            // TODO Auto-generated catch block
         e.printStackTrace();
         }
         System.out.println("Thread: " + Thread.currentThread().getName() + ", " + i);         
      }
      System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
   }
}

public class TestThread {
   public static void main(String args[]) throws InterruptedException {
      Thread t1 = new Thread( new RunnableDemo(), "Thread-1");
      Thread t2 = new Thread( new RunnableDemo(), "Thread-2");
      Thread t3 = new Thread( new RunnableDemo(), "Thread-3");
      // start t1 thread and join main thread
      t1.start();
      t1.join(200);	  
      // t2 will start when t1 is dead or 200 ms is elapsed
      t2.start();        
      t2.join(200);
      // t3 will start when t2 is dead or 200 ms is elapsed
      t3.start();
   }
}

輸出

Thread: main, State: New
Thread: main, State: New
Thread: main, State: New
Thread: Thread-1, State: Running
Thread: Thread-1, 4
Thread: Thread-1, 3
Thread: Thread-1, 2
Thread: Thread-2, State: Running
Thread: Thread-1, 1
Thread: Thread-1, State: Dead
Thread: Thread-2, 4
Thread: Thread-2, 3
Thread: Thread-2, 2
Thread: Thread-3, State: Running
Thread: Thread-2, 1
Thread: Thread-2, State: Dead
Thread: Thread-3, 4
Thread: Thread-3, 3
Thread: Thread-3, 2
Thread: Thread-3, 1
Thread: Thread-3, State: Dead

示例 2

在此示例中,我們透過實現 Runnable 介面建立一個 RunnableDemo 類。RunnableDemo 類具有 run() 方法的實現。在主類 TestThread 中,我們建立了 RunnableDemo 物件,並使用這些物件建立了兩個 Thread 物件。當在每個執行緒物件上呼叫 Thread.start() 方法時,執行緒開始處理並執行程式。使用 join(long millisec, long nanoseconds) 方法,我們將當前執行緒阻塞 200 毫秒和 100000 納秒,以確保一旦一個執行緒完成或延遲 201 毫秒後,只有下一個執行緒才會啟動。

package com.tutorialspoint;

class RunnableDemo implements Runnable {
   RunnableDemo( ) {
      System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: New");
   }

   public void run() {
      System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
      for(int i = 4; i > 0; i--) {
         try {
            Thread.sleep(49);
         } catch (InterruptedException e) {
            // TODO Auto-generated catch block
         e.printStackTrace();
         }
         System.out.println("Thread: " + Thread.currentThread().getName() + ", " + i);         
      }
      System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
   }
}

public class TestThread {
   public static void main(String args[]) throws InterruptedException {
      Thread t1 = new Thread( new RunnableDemo(), "Thread-1");
      Thread t2 = new Thread( new RunnableDemo(), "Thread-2");
      Thread t3 = new Thread( new RunnableDemo(), "Thread-3");
      
      // start t1 thread and join main thread
      t1.start();
      t1.join(200,100000);	  
      
      // t2 will start when t1 is dead or 201 ms is elapsed
      t2.start();        
      t2.join(200,100000);
      
      // t3 will start when t2 is dead or 201 ms is elapsed
      t3.start();
   }
}

輸出

Thread: main, State: New
Thread: main, State: New
Thread: main, State: New
Thread: Thread-1, State: Running
Thread: Thread-1, 4
Thread: Thread-1, 3
Thread: Thread-1, 2
Thread: Thread-1, 1
Thread: Thread-1, State: Dead
Thread: Thread-2, State: Running
Thread: Thread-2, 4
Thread: Thread-2, 3
Thread: Thread-2, 2
Thread: Thread-2, 1
Thread: Thread-2, State: Dead
Thread: Thread-3, State: Running
Thread: Thread-3, 4
Thread: Thread-3, 3
Thread: Thread-3, 2
Thread: Thread-3, 1
Thread: Thread-3, State: Dead
廣告