Groovy 怎么加入线程?

文章导读
Previous Quiz Next 一旦创建了 Thread 对象,就可以调用 start() 方法启动它,该方法会执行对 run() 方法的调用。在多个线程运行时,我们可以阻塞当前线程,直到另一个线程终止。
📋 目录
  1. A Groovy 中的线程加入
  2. B 语法
  3. C 示例 - 线程加入
  4. D 示例 - 使用阻塞时间连接线程
  5. E 示例 - 使用更精确延迟的线程连接
A A

Groovy - 线程加入



Previous
Quiz
Next

一旦创建了 Thread 对象,就可以调用 start() 方法启动它,该方法会执行对 run() 方法的调用。在多个线程运行时,我们可以阻塞当前线程,直到另一个线程终止。

Groovy 中的线程加入

Groovy 中的线程加入指的是等待(或阻塞)一个线程,直到另一个线程完成其执行。Thread 类的 join() 方法即用于此目的。

语法

以下是 join() 方法的简单语法 −

void join();

重载的 Thread.join() 方法

以下是三个重载的 join() 方法 −

  • join() − 当前线程在此方法上调用第二个线程,导致当前线程阻塞,直到第二个线程终止。

  • join(long millisec) − 当前线程在此方法上调用第二个线程,导致当前线程阻塞,直到第二个线程终止或指定的毫秒数过去。

  • join(long millisec, int nanos) − 当前线程在此方法上调用第二个线程,导致当前线程阻塞,直到第二个线程终止或指定的毫秒数 + 纳秒数过去。

示例 - 线程加入

在本示例中,我们通过实现 Runnable 接口创建一个 RunnableDemo 类。RunnableDemo 类实现了 run() 方法。在主类 TestThread 中,我们创建了 RunnableDemo 对象,并使用这些对象创建了两个 Thread 对象。当对每个线程对象调用 Thread.start() 方法时,线程开始处理并执行程序。使用 join() 方法,我们阻塞当前线程,确保一个线程完成后下一个线程才会启动。

Example.groovy

class Example {
   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");
      // 启动 t1 线程并让 main 线程加入
      t1.start();
      t1.join();	  
      // t2 将在 t1 终止后启动
      t2.start();        
      t2.join();
      // t3 将在 t2 终止后启动
      t3.start();
   }
}
class RunnableDemo implements Runnable {
   RunnableDemo( ) {
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: New");
   }

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

输出

上述程序产生以下输出 −

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

示例 - 使用阻塞时间连接线程

在这个示例中,我们通过实现 Runnable 接口来创建一个 RunnableDemo class。RunnableDemo class 实现了 run() 方法。在主类 TestThread 中,我们创建了 RunnableDemo 对象,并使用这些对象创建了两个 Thread 对象。当对每个 thread 对象调用 Thread.start() 方法时,线程开始处理并执行程序。使用 join(long millisec) 方法,我们阻塞当前线程 200 毫秒,这确保只有在 thread 完成或延迟 200 ms 后,下一个 thread 才会启动。

Example.groovy

class Example {
   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");
      // 启动 t1 thread 并连接 main thread
      t1.start();
      t1.join(200);	  
      // 当 t1 结束或 200 ms 过去后 t2 将启动
      t2.start();        
      t2.join(200);
      // 当 t2 结束或 200 ms 过去后 t3 将启动
      t3.start();
   }
}
class RunnableDemo implements Runnable {
   RunnableDemo( ) {
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: New");
   }

   public void run() {
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
      for(int i = 4; i > 0; i--) {
         try {
            Thread.sleep(50);
         } catch (InterruptedException e) {
            // TODO 自动生成的 catch 块
         e.printStackTrace();
         }
         println("Thread: " + Thread.currentThread().getName() + ", " + i);         
      }
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
   }
}

输出

上述程序产生以下输出 −

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-2, State: Running
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

示例 - 使用更精确延迟的线程连接

在这个示例中,我们通过实现 Runnable 接口来创建一个 RunnableDemo class。RunnableDemo class 实现了 run() method。在主类 TestThread 中,我们创建了 RunnableDemo 对象,并使用这些对象创建了两个 Thread 对象。当对每个 thread 对象调用 Thread.start() method 时,threads 开始处理并执行程序。使用 join(long millisec, long nanoseconds) method,我们阻塞当前 thread 200 毫秒和 100000 纳秒,这确保只有当 thread 完成或延迟 201 ms 发生时,下一个 thread 才会启动。

Example.groovy

class Example {
   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");
      
      // 启动 t1 thread 并连接 main thread
      t1.start();
      t1.join(200,100000);	  
      
      // 当 t1 结束或经过 201 ms 时,t2 将启动
      t2.start();        
      t2.join(200,100000);
      
      // 当 t2 结束或经过 201 ms 时,t3 将启动
      t3.start();
   }
}

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

   public void run() {
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
      for(int i = 4; i > 0; i--) {
         try {
            Thread.sleep(49);
         } catch (InterruptedException e) {
            // TODO 自动生成的 catch 块
         e.printStackTrace();
         }
         println("Thread: " + Thread.currentThread().getName() + ", " + i);         
      }
      println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
   }
}

输出

上述程序产生以下输出 −

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