Java 简明教程
Java - Joining Threads
创建 Thread 对象后,可以通过调用 start() method 开始该对象,这会执行对 run() method 的调用。在运行多个线程的情况下,我们可以阻止当前线程,直到另一个线程终止为止。
Joining Threads in Java
在 Java 中联接线程指的是在另一个线程完成执行之前等待(或阻塞)线程。 Thread class 的 join() 方法用于此目的。
Overloaded Thread.join() Methods
以下是三个重载的 join() 方法 -
-
join() − 当前线程在第二个线程上调用此方法,导致当前线程阻塞,直到第二个线程终止。
-
join(long millisec) − 当前线程在第二个线程上调用此方法,导致当前线程阻塞,直到第二个线程终止或经过指定数量的毫秒。
-
join(long millisec, int nanos) − 当前线程在第二个线程上调用此方法,导致当前线程阻塞,直到第二个线程终止或经过指定的毫秒数 + 纳秒数。
Example of Joining Threads in 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
More Example of Joining Threads in Java
Example 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
Example 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