如何在java中重复运行多个任务并在一定时间后停止它

use*_*160 1 java multithreading runnable scheduledexecutorservice

我已经看到了我的答案的一部分,但不是完整的。

我知道如果你想同时运行多个任务你想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);
Run Code Online (Sandbox Code Playgroud)

但这只运行一个线程,并且没有方法或参数在一段时间后杀死进程

我想做的是每 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Bor*_*der 6

TL;DR:安排另一个任务来取消第一个任务。

首先,不要忽视返回值——这是一个坏习惯,停止这样做并练习不这样做。该方法ScheduledExecutorService.scheduleAtFixedRate返回一个ScheduledFuture<?>- 这允许您取消任务!

因此,要每秒运行该任务101分钟:

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);
Run Code Online (Sandbox Code Playgroud)

另一件需要注意的事情是,如果你从不调用 ,getFuture永远不知道任务是否失败 - 这意味着你需要另一个 Thread任务来等待promise.get,这样如果Exception抛出 ,你立即知道出了问题。

那么接下来的问题就是谁来监控监控线程。因此,如果您想要强大的东西,您很快就会发现自己重新实现了任务调度库。


还要注意有用的实用方法Executors.newSingleThreadScheduledExecutor()