java - 定期执行线程并在满足条件或时间结束后停止它

标签 java java-threads

我想定期执行一个线程来检查某个文件是否准备好上传,并在准备好后立即上传,然后立即停止线程。另外,如果已经过去很长一段时间,我想停止线程,无论文件尚未准备好,但不能在 run 方法本身内部执行此操作。

    final ScheduledFuture<?> fileUploadedFuture = scheduler.scheduleAtFixedRate(() -> {
        try {
            if (fileReady("xyz.txt")) {
                uploadFile("xyz.txt")
                //cancel fileUploadedFuture and fileUploadedFutureCanceller
            }
        } catch (Exception e) {
            throw new ServiceException(e);
        }
    }, 0, delay, TimeUnit.SECONDS);

    final ScheduledFuture<?> fileUploadedFutureCanceller = scheduler.schedule(() -> {
        fileUploadedFuture.cancel(true);
    }, 60, TimeUnit.SECONDS);
}

最佳答案

使用 ScheduledThreadPoolExecutor 怎么样?

public class TestExecutor {
    private static ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);

    private static class PushFile implements Runnable {
        @Override
        public void run() {
            if (new File("test.txt").exists()) {
                System.out.println("found it!");
                exec.shutdown();
            } else {
                System.out.println("waiting");
            }
        }

    }

    private static class ShutMeDown implements Runnable {
        @Override
        public void run() {
            System.out.println("timeout");
            exec.shutdown();
        }
    }

    public static void main(String[] args) {
        exec.scheduleWithFixedDelay(new PushFile(), 0, 1, TimeUnit.SECONDS);
        exec.scheduleWithFixedDelay(new ShutMeDown(), 10, 1, TimeUnit.SECONDS);
    }
}

关于java - 定期执行线程并在满足条件或时间结束后停止它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44006905/

相关文章:

Java如何停止并发运行的线程

java - 有没有比 Await 更好的使用 CountUpDownLatch 的方法?

java - CRFClassifier 无法识别句子分割器选项

java - Mod 被 java 编译器忽略

java - 在java 8中与lettuce建立redis连接的正确方法

java - 有没有可以基于接口(interface)构建类型的 IoC 容器?

Java 线程转储 CPU 还是只是 IO 等待?

java - 线程的非参数化构造函数是做什么的以及在启动之前如何调用它的 sleep 方法

java - java线程之间共享变量的方法

java - 使用 Hibernate-Java 执行查询