Java等待某个线程执行完

在多线程编程中,我们经常会遇到一种情况:希望等待某个线程执行完毕后再继续执行其他操作。这个需求可以通过Java提供的一些机制来实现,本文将介绍几种常见的实现方式,并给出相应的代码示例。

1. 使用Thread的join方法

Java的Thread类提供了一个join方法,可以用来等待某个线程执行完毕。当一个线程调用另一个线程的join方法时,它将会等待该线程执行完毕后再继续执行。

下面是一个使用join方法的示例代码:

public class JoinThreadExample {

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            // 线程执行的逻辑
            System.out.println("Thread is running");
        });

        thread.start();
        thread.join(); // 等待thread执行完毕

        System.out.println("Main thread continues");
    }
}

在上面的代码中,创建了一个新的线程,并在该线程的逻辑中输出一条信息。然后,调用了join方法来等待该线程执行完毕。当这个线程执行完毕后,才会继续执行join方法后面的代码。

2. 使用CountDownLatch

CountDownLatch是Java的一个同步辅助类,可以用于控制线程的执行顺序。它提供了一个计数器,当计数器的值达到0时,等待该计数器的线程将被唤醒。

下面是一个使用CountDownLatch的示例代码:

import java.util.concurrent.CountDownLatch;

public class CountDownLatchExample {

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(1);

        Thread thread = new Thread(() -> {
            // 线程执行的逻辑
            System.out.println("Thread is running");
            latch.countDown(); // 计数器减一
        });

        thread.start();
        latch.await(); // 等待计数器变为0

        System.out.println("Main thread continues");
    }
}

在上面的代码中,首先创建了一个CountDownLatch,并将计数器初始化为1。然后,在新的线程中执行一些逻辑,并在最后调用了countDown方法来减少计数器的值。在主线程中,调用await方法来等待计数器的值变为0。当计数器的值变为0时,主线程才会继续执行。

3. 使用Object的wait和notify方法

Java的Object类提供了两个方法:wait和notify,可以用来实现线程的等待和唤醒机制。

下面是一个使用wait和notify方法的示例代码:

public class WaitNotifyExample {

    public static void main(String[] args) throws InterruptedException {
        Object lock = new Object();
        boolean isFinished = false;

        Thread thread = new Thread(() -> {
            // 线程执行的逻辑
            synchronized (lock) {
                System.out.println("Thread is running");
                isFinished = true;
                lock.notify(); // 唤醒等待该对象的线程
            }
        });

        thread.start();

        synchronized (lock) {
            while (!isFinished) {
                lock.wait(); // 等待该对象的notify方法
            }
        }

        System.out.println("Main thread continues");
    }
}

在上面的代码中,首先创建了一个共享对象lock和一个标志变量isFinished。新的线程在执行逻辑之前获取了lock的锁,并在最后调用了notify方法来唤醒等待该对象的线程。在主线程中,通过获取lock的锁来进入同步块,并在循环中使用wait方法来等待lock的锁,直到isFinished变为true时,才会继续执行。

4. 使用Future和Callable

Java的并发库提供了一个Future接口,可以用来获取异步操作的结果。Callable是一个类似于Runnable接口的接口,它可以在执行完毕后返回一个结果。

下面是一个使用Future和Callable的示例代码:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class FutureCallableExample {

    public static void main(String[] args)