Android 等待另一个线程结束

在 Android 开发中,经常会遇到需要等待另一个线程执行完毕的场景。这可能是由于需要等待异步任务的结果,或者需要确保某些操作在另一个线程执行完毕后再进行。本文将介绍几种常见的方法来实现在 Android 中等待另一个线程结束的方式,并提供相应的代码示例。

1. 使用 join 方法

在 Java 中,可以使用 Thread 类的 join 方法来等待一个线程执行完毕。在 Android 中也可以使用该方法来实现等待另一个线程结束的效果。

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        // 在这里执行耗时操作
    }
});

thread.start(); // 启动线程

try {
    thread.join(); // 等待线程执行完毕
} catch (InterruptedException e) {
    e.printStackTrace();
}

// 在这里执行等待线程执行完毕后的操作

上述代码中,首先创建一个新的线程并启动它。然后使用 join 方法将当前线程阻塞,直到等待的线程执行完毕。在等待线程执行完毕后,将会继续执行 join 方法后面的代码。

这种方法的缺点是会阻塞当前线程,如果等待的线程执行时间很长,将会导致界面卡顿或无响应。因此,在需要等待的线程执行时间较长时,应该考虑使用其他方法。

2. 使用 CountDownLatch

CountDownLatch 是 Java.util.concurrent 包中提供的一个同步工具类,通过它可以实现线程之间的等待。

final CountDownLatch latch = new CountDownLatch(1);

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        // 在这里执行耗时操作
        latch.countDown(); // 线程执行完毕后,调用 countDown 方法
    }
});

thread.start(); // 启动线程

try {
    latch.await(); // 等待线程执行完毕
} catch (InterruptedException e) {
    e.printStackTrace();
}

// 在这里执行等待线程执行完毕后的操作

上述代码中,首先创建一个 CountDownLatch 对象,参数为需要等待的线程数量,这里设置为 1。然后在等待的线程执行完毕后调用 countDown 方法。在需要等待的线程执行完毕后,调用 await 方法进行等待,直到计数器值减为 0 后继续执行后面的代码。

使用 CountDownLatch 的优点是可以灵活控制等待的线程数量,以及在等待线程执行完毕后的回调操作。但需要注意的是,CountDownLatch 的计数器只能减一次,如果需要再次等待,需要创建一个新的 CountDownLatch 对象。

3. 使用 FutureTask

FutureTask 是 Java.util.concurrent 包中提供的一个可取消的异步计算任务类,它可以用于等待另一个线程的执行结果。

FutureTask<Result> futureTask = new FutureTask<>(new Callable<Result>() {
    @Override
    public Result call() throws Exception {
        // 在这里执行耗时操作
        return result; // 返回执行结果
    }
});

Thread thread = new Thread(futureTask);
thread.start(); // 启动线程

try {
    Result result = futureTask.get(); // 等待线程执行完毕并获取执行结果
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}

// 在这里执行等待线程执行完毕后的操作

上述代码中,首先创建一个 FutureTask 对象,并传入一个 Callable 对象作为参数。在 Callable 对象的 call 方法中执行耗时操作,并返回一个结果。然后创建一个新的线程并启动它。使用 futureTask.get 方法等待线程执行完毕并获取执行结果。在等待线程执行完毕后,可以通过 futureTask.get 方法获取线程的执行结果。

使用 FutureTask 的好处是可以获取执行结果,并且可以使用 isDone 方法判断线程是否执行完毕。另外,如果不需要获取执行结果,也可以使用 FutureTask 作为一个可取消的任务。

总结

本文介绍了几种在 Android 中等待另一个线程结束