java - 获取定时任务的结果

标签 java concurrency scheduled-tasks scheduling java.util.concurrent

我正在尝试学习 java 并发 API,并且为了我的练习,我想安排一个作业每隔 X 秒定期运行一次。该作业将计算一个随机数。

我想在定时任务完成后第一时间得到结果。 我无法仅使用 API 完成此操作,所以我破解了它。

有没有办法在不使用低级机制的情况下做得更好? 我希望能够删除 MyRandomGiverTask.getResult() 中的同步,而是使用 类似于 ScheduledFuture.get()。但是在我的代码中,ScheduledFuture 从未完成/完成。 这是我目前的解决方案:

class A {
    public static void main() {
        MyRandomGiverTask task = new MyRandomGiverTask(200);
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        ScheduledFuture<Double> scheduledDouble =
            (ScheduledFuture<Double>) scheduler
                .scheduleAtFixedRate(task, 1, 4, TimeUnit.SECONDS);
        while (true) {
            System.out.println(" >> " + task.getResult());
        }
    }
    public class MyRandomGiverTask implements Runnable {
        MyRandomGiver giver = new MyRandomGiver();
        int param;
        double result;
        public MyRandomGiverTask(int param) { this.param = param; }
        @Override public void run() { result = giver.getRandom(param); }
        public double getResult() {
            try {
                while (result == 0d) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                return result;
            } finally {
                result = 0d;
            }
        }
    }
}

最佳答案

您的任务按固定速率安排。这意味着在您取消任务之前,它会由执行者以固定的速率一次又一次地执行。这样的任务唯一能做的就是产生副作用。它不能返回任何东西,因为执行者返回的 future 代表任务的所有未决执行。顺便说一句,您会注意到 schedule 方法采用 Callable 作为参数(这可能会产生一些结果),而 sceduleAtFixedRate 方法仅采用 Runnable 作为参数(返回 void ,因此不能返回任何东西)。

所以,如果你想打印每次执行的结果,那么简单地让任务本身(Runnable)打印它的结果,或者让 runnable 把它的结果放在一个阻塞队列中,并让主线程 从队列中取出。主线程将因此被阻塞,直到一些结果被放入队列。

关于java - 获取定时任务的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8869870/

相关文章:

java - JSF 中的空白页

java - 异步等同于 Java 中的 BlockingQueue?

java - 如何暂停 Runnable() 对象以进行测试

windows - 通过启动脚本打开 Powershell 窗口时会去哪里?

c# - 如何在 .NET 中每小时(或每小时特定时间间隔)引发一个事件?

java - Android 6 上的 setMyLocationEnabled() 错误

java - 什么是套接字绑定(bind)以及如何绑定(bind)地址?

java - 生成有关日志记录级别的报告

ruby - Ruby 线程不能在写入时发生冲突吗?

c - 为什么 sched_setscheduler() 如果没有包含在 if block 中则不起作用?