我想了解一下ScheduledExecutorService创建定时任务的基本用法。请以markdown格式输出，并且确保例子代码中包含finally语句，需要以try-with-resources语句使用ScheduledExecutorService，代码块中需包含三个要点：1. 创建ScheduledExecutorService实例；2. 定义定时任务;3. 将任务提交给ScheduledExecutorService执行。请在答案中至少包含输入的这些信息。
user
```markdown
# ScheduledExecutorService创建定时任务的基本用法

为了演示如何使用 `ScheduledExecutorService` 创建和执行定时任务，下面提供了一个简单的例子。此示例包括创建 `ScheduledExecutorService` 实例、定义一个定时任务以及将此任务提交给 `ScheduledExecutorService` 执行的完整步骤。

```java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ScheduledFuture;

public class ScheduledExecutorExample {
    public static void main(String[] args) {
        try (ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor()) {
            // 1. 创建ScheduledExecutorService实例
            // 实例已在此创建：executor
            
            // 2. 定义定时任务
            Runnable task = () -> System.out.println("任务执行于 " + System.currentTimeMillis());

            // 3. 将任务提交给ScheduledExecutorService执行
            // 下面的调用表示：从现在开始1秒后启动任务，并且每5秒钟执行一次该任务。
            ScheduledFuture<?> future = executor.scheduleAtFixedRate(task, 1, 5, TimeUnit.SECONDS);
            
            // 模拟无限期执行（在实际应用中，应有一个条件来终止执行）
            Thread.sleep(10000); // 让主线程等待10秒
            future.cancel(false); // 取消任务，参数若为true则会中断正在执行的任务
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println("任务执行结束");
        }
    }
}
```

在此代码示例中，我们使用了 `try-with-resources` 语句来确保 `ScheduledExecutorService` 在完成任务或遇到异常时能够正确关闭。采用 `scheduleAtFixedRate` 方法来定期执行一系列动作，这种方法在需要执行重复任务时非常有用。
```

上述代码示例首先创建了一个单线程的 `ScheduledExecutorService` 实例，定义了一个简单输出当前时间戳的定时任务，然后将该任务以固定频率提交给执行器服务。在任务执行完成后（或尝试结束后），通过 `finally` 语句块来输出一个提示信息，表明任务执行完毕。
assistant