如何 运行 重复执行多个任务并在 java 一定时间后停止
How to run a number of task repeatedly and stop it after a certain amount of time in java
我在这里和那里看到了我的部分答案,但不是完整的答案。
我知道如果你想同时执行 运行 多个任务,你想使用 Thread
和 Runnable
实现
我发现如果您想 运行 像这样的重复性任务,您可以使用 ScheduledExecutorService
:
Runnable helloRunnable = () -> System.out.println("Hello world " + LocalDateTime.now().toLocalTime().toString());
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 0, 10, TimeUnit.SECONDS);
但是这个运行只是一个线程,没有方法或参数在一定时间后终止进程
我想做的是 运行 每 10 秒并行执行同一任务 5 次,持续 10 分钟
编辑
如果未来的人对这里的完整示例感兴趣,那就是:
public static void main(String[] args) {
Runnable helloRunnable = () -> System.out.println("Hello world " + LocalDateTime.now().toLocalTime().toString());
Runnable testRunnable = () -> System.out.println("Test runnable " + LocalDateTime.now().toLocalTime().toString());
List<Runnable> taskList = new ArrayList<>();
taskList.add(helloRunnable);
taskList.add(testRunnable);
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
List <ScheduledFuture<?>> promiseList = new ArrayList<>();
for (Runnable runnable : taskList) {
ScheduledFuture<?> promise = executor.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
promiseList.add(promise);
}
List <Runnable> cancelList = new ArrayList<>();
for (ScheduledFuture<?> promise : promiseList) {
Runnable cancelRunnable = () -> {
promise.cancel(false);
executor.shutdown();
};
cancelList.add(cancelRunnable);
}
List <ScheduledFuture<?>> canceledList = new ArrayList<>();
for (Runnable runnable : cancelList){
ScheduledFuture<?> canceled = executor.schedule(runnable, 10, TimeUnit.SECONDS);
canceledList.add(canceled);
}
}
TL;DR: 安排另一个任务来取消第一个任务。
首先,不要忽略 return 值 - 这是养成的坏习惯,停止这样做并练习不这样做。方法 ScheduledExecutorService.scheduleAtFixedRate
returns a ScheduledFuture<?>
- 这允许您取消任务!
因此,运行 任务每 10
秒 1
分钟:
final Runnable helloRunnable = () -> System.out.println("Hello world " + LocalDateTime.now().toLocalTime().toString());
final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
final ScheduledFuture<?> promise = executor.scheduleAtFixedRate(helloRunnable, 0, 10, TimeUnit.SECONDS);
final ScheduledFuture<Boolean> canceller = executor.schedule(() -> promise.cancel(false), 1, TimeUnit.MINUTES);
另一件需要注意的事情是,如果你从不在 Future
上调用 get
,你永远不知道任务是否失败 - 这意味着你需要 另一个 Thread
等待 promise.get
,这样如果抛出 Exception
,您会立即知道出了问题。
那么接下来的问题是who monitors the monitoring threads。因此,如果您想要稳健的东西,您很快就会发现自己重新实现了一个任务调度库。
另请注意有用的实用方法Executors.newSingleThreadScheduledExecutor()
。
我在这里和那里看到了我的部分答案,但不是完整的答案。
我知道如果你想同时执行 运行 多个任务,你想使用 Thread
和 Runnable
实现
我发现如果您想 运行 像这样的重复性任务,您可以使用 ScheduledExecutorService
:
Runnable helloRunnable = () -> System.out.println("Hello world " + LocalDateTime.now().toLocalTime().toString());
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(helloRunnable, 0, 10, TimeUnit.SECONDS);
但是这个运行只是一个线程,没有方法或参数在一定时间后终止进程
我想做的是 运行 每 10 秒并行执行同一任务 5 次,持续 10 分钟
编辑
如果未来的人对这里的完整示例感兴趣,那就是:
public static void main(String[] args) {
Runnable helloRunnable = () -> System.out.println("Hello world " + LocalDateTime.now().toLocalTime().toString());
Runnable testRunnable = () -> System.out.println("Test runnable " + LocalDateTime.now().toLocalTime().toString());
List<Runnable> taskList = new ArrayList<>();
taskList.add(helloRunnable);
taskList.add(testRunnable);
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
List <ScheduledFuture<?>> promiseList = new ArrayList<>();
for (Runnable runnable : taskList) {
ScheduledFuture<?> promise = executor.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
promiseList.add(promise);
}
List <Runnable> cancelList = new ArrayList<>();
for (ScheduledFuture<?> promise : promiseList) {
Runnable cancelRunnable = () -> {
promise.cancel(false);
executor.shutdown();
};
cancelList.add(cancelRunnable);
}
List <ScheduledFuture<?>> canceledList = new ArrayList<>();
for (Runnable runnable : cancelList){
ScheduledFuture<?> canceled = executor.schedule(runnable, 10, TimeUnit.SECONDS);
canceledList.add(canceled);
}
}
TL;DR: 安排另一个任务来取消第一个任务。
首先,不要忽略 return 值 - 这是养成的坏习惯,停止这样做并练习不这样做。方法 ScheduledExecutorService.scheduleAtFixedRate
returns a ScheduledFuture<?>
- 这允许您取消任务!
因此,运行 任务每 10
秒 1
分钟:
final Runnable helloRunnable = () -> System.out.println("Hello world " + LocalDateTime.now().toLocalTime().toString());
final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
final ScheduledFuture<?> promise = executor.scheduleAtFixedRate(helloRunnable, 0, 10, TimeUnit.SECONDS);
final ScheduledFuture<Boolean> canceller = executor.schedule(() -> promise.cancel(false), 1, TimeUnit.MINUTES);
另一件需要注意的事情是,如果你从不在 Future
上调用 get
,你永远不知道任务是否失败 - 这意味着你需要 另一个 Thread
等待 promise.get
,这样如果抛出 Exception
,您会立即知道出了问题。
那么接下来的问题是who monitors the monitoring threads。因此,如果您想要稳健的东西,您很快就会发现自己重新实现了一个任务调度库。
另请注意有用的实用方法Executors.newSingleThreadScheduledExecutor()
。