首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取定时任务结果

获取定时任务结果
EN

Stack Overflow用户
提问于 2012-01-15 21:14:28
回答 2查看 2.6K关注 0票数 1

我正在尝试学习java concurrency API,对于我的练习,我想安排一个作业每X秒定期运行一次。作业将计算一个随机数。

我想在计划任务完成后尽快得到结果。我不能只使用API来完成这项工作,所以我破解了它。

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

代码语言:javascript
复制
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;
            }
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-15 21:30:47

如果要计算每个随机数,请使用BlockingQueue。调度任务put()队列中的新随机数,任何想要它们的人都可以take()它们。

此外,如果您打算使用类似于您的解决方案的解决方案,您将希望使用wait()/notify(),而不是sleep()

票数 2
EN

Stack Overflow用户

发布于 2012-01-15 21:30:36

您的任务是以固定速率调度的。这意味着,在您取消任务之前,executor将以固定的速率一次又一次地执行它。这样的任务唯一能做的就是产生副作用。它不能返回任何东西,因为由executor返回的未来表示任务的所有挂起执行。顺便说一句,您会注意到schedule方法采用了一个可调用的as参数(这可能会产生一些结果),而sceduleAtFixedRate方法只接受了一个Runnable as参数(它返回的是空,因此不能返回任何东西)。

因此,如果您想打印每次执行的结果,那么只需让任务本身( Runnable)打印其结果,或者让runnable将其结果放入阻塞队列中,并让主线程从队列中执行take。因此,主线程将被阻塞,直到将某些结果放入队列。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8869870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档