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: