JavaFutureTask
是一个实现了 RunnableFuture
接口的类,它允许你在一个单独的线程中执行任务。要实现任务调度,你可以使用 ScheduledExecutorService
。以下是一个简单的示例,展示了如何使用 JavaFutureTask
和 ScheduledExecutorService
实现任务调度:
- 首先,导入所需的类:
import java.util.concurrent.*;
- 创建一个实现
Runnable
接口的任务类:
class MyTask implements Runnable { private String taskName; public MyTask(String taskName) { this.taskName = taskName; } @Override public void run() { System.out.println("Executing task: " + taskName); try { // 模拟任务执行耗时 Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Task completed: " + taskName); } }
- 创建一个方法来调度任务:
public static ScheduledFuture> scheduleTask(ScheduledExecutorService executor, MyTask task, long delay, TimeUnit unit) { // 使用 JavaFutureTask 包装任务 JavaFutureTaskfutureTask = new JavaFutureTask<>(task, null); // 调度任务 return executor.schedule(futureTask, delay, unit); }
- 在
main
方法中创建一个ScheduledExecutorService
实例,并调度任务:
public static void main(String[] args) { // 创建一个具有单个线程的 ScheduledExecutorService ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); // 创建任务实例 MyTask task1 = new MyTask("Task 1"); MyTask task2 = new MyTask("Task 2"); // 调度任务,延迟 3 秒后执行,每隔 1 秒执行一次 ScheduledFuture> future1 = scheduleTask(executor, task1, 3, TimeUnit.SECONDS); ScheduledFuture> future2 = scheduleTask(executor, task2, 0, TimeUnit.SECONDS); // 添加任务完成时的监听器 future1.addListener(() -> System.out.println("Task 1 completed."), executor); future2.addListener(() -> System.out.println("Task 2 completed."), executor); // 关闭 executor executor.shutdown(); }
在这个示例中,我们创建了一个名为 MyTask
的任务类,它实现了 Runnable
接口。然后,我们创建了一个名为 scheduleTask
的方法,该方法接受一个 ScheduledExecutorService
实例、一个任务实例、一个延迟以及一个时间单位作为参数。这个方法使用 JavaFutureTask
包装任务,并使用 ScheduledExecutorService
的 schedule
方法调度任务。
在 main
方法中,我们创建了一个 ScheduledExecutorService
实例,并调度了两个任务。第一个任务延迟 3 秒后执行,第二个任务立即执行。我们还为每个任务添加了一个监听器,当任务完成时,它将打印一条消息。最后,我们关闭了 executor
。