Android ScheduledExecutorService shutdownNow

什么是ScheduledExecutorService

ScheduledExecutorService是Java中的一个接口,它扩展了ExecutorService接口,并提供了一种可以在给定时间延迟后运行任务的机制。ScheduledExecutorService可以用于创建定时任务,例如定时执行某个任务、定时执行某个操作等。在Android开发中,ScheduledExecutorService被广泛应用于处理定时任务和定时操作。

ScheduledExecutorService的用法

ScheduledExecutorService接口定义了几个方法来执行定时任务:

  • schedule(Runnable command, long delay, TimeUnit unit):在给定的延迟之后执行命令。
  • schedule(Callable<V> callable, long delay, TimeUnit unit):在给定的延迟之后执行命令,并返回一个Future表示该任务的计算结果。
  • scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit):以固定的速率周期性地执行命令,即在初始延迟之后开始执行,然后在每个执行的开始时间点后延迟period时间执行。
  • scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit):以固定的延迟周期性地执行命令,即在初始延迟之后开始执行,然后在每个执行的完成时间点后延迟delay时间执行。

ScheduledExecutorService示例代码

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

import java.util.concurrent.*;

public class ScheduledExecutorServiceExample {

    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

        // 在延迟1秒后执行任务
        executor.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("Task executed!");
            }
        }, 1, TimeUnit.SECONDS);

        // 在延迟2秒后执行任务,并返回一个Future表示任务的计算结果
        Future<String> future = executor.schedule(new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "Task executed!";
            }
        }, 2, TimeUnit.SECONDS);

        try {
            // 等待任务的完成,并获取任务的计算结果
            String result = future.get();
            System.out.println(result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        // 以固定的速率每1秒执行一次任务
        executor.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("Task executed!");
            }
        }, 0, 1, TimeUnit.SECONDS);

        // 以固定的延迟每1秒执行一次任务
        executor.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                System.out.println("Task executed!");
            }
        }, 0, 1, TimeUnit.SECONDS);

        // 关闭ScheduledExecutorService
        executor.shutdown();
    }
}

在上述代码中,我们首先创建了一个ScheduledExecutorService实例,然后使用不同的方法来执行不同类型的定时任务。最后,我们使用shutdown()方法来关闭ScheduledExecutorService。

ScheduledExecutorService的关闭

当我们使用ScheduledExecutorService执行完定时任务后,我们应该及时关闭它以释放资源。ScheduledExecutorService提供了两个方法来关闭:

  • shutdown():启动有序关闭,已提交的任务将继续执行,但不再接受新的任务。
  • shutdownNow():尝试停止所有正在执行的任务,并返回等待执行的任务列表。

当我们调用shutdownNow()方法时,ScheduledExecutorService会尝试停止所有正在执行的任务,并返回等待执行的任务列表。但是,这个方法并不能保证能够停止所有任务的执行,它仅仅是发送了一个中断信号给任务线程,如果任务线程没有正确处理中断信号,则可能无法停止任务的运行。

下面是使用shutdownNow()方法的示例代码:

import java.util.List;
import java.util.concurrent.*;

public class ScheduledExecutorServiceShutdownExample {

    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);

        // 在延迟1秒后执行任务
        executor.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("Task executed!");
            }
        }, 1, TimeUnit.SECONDS);

        // 关闭ScheduledExecutorService
        List<Runnable> pendingTasks = executor.shutdownNow();

        // 输出等待执行的任务数
        System.out.println("Pending tasks: