加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

为什么Java的scheduleWithFixedDelay使用Runnable而不是FutureTa

发布时间:2020-12-15 02:54:14 所属栏目:Java 来源:网络整理
导读:为什么 Java的scheduleWithFixedDelay使用Runnable而不是FutureTask包装runnable? 使用两个不同的代码示例可以很容易地显示它: ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); executorService.scheduleWithF
为什么 Java的scheduleWithFixedDelay使用Runnable而不是FutureTask包装runnable?

使用两个不同的代码示例可以很容易地显示它:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
        executorService.scheduleWithFixedDelay(new FutureTask<Integer>(new Callable<Integer>() {

            @Override
            public Integer call() throws Exception {
                System.out.println("beep");
                return 1;
            }
        }),1,5,TimeUnit.SECONDS);

生产:

beep

但是应用程序没有退出,它似乎只是等待.

但:

ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleWithFixedDelay(new Runnable() {

        @Override
        public void run() {
            System.out.println("beep ");
        }
    },TimeUnit.SECONDS);

生产:





以5秒的间隔.

看起来这里发生了一些我无法确定的锁定.

解决方法

因为你有点滥用FutureTask.

根据Javadocs,FutureTask是“可取消的异步计算”,但更通俗地说,它包含了Runnable / Callable的特定执行以提供异步性.我实际上没有意识到它实现了Runnable,直到我刚才检查 – run()的实现“将此Future设置为其计算结果”.

所以在你的第一个例子中发生的是你正在安排未来的任务,它的run方法在1秒后被调用,因此它计算计算的结果(即运行嵌入的Runnable).当这个方法退出时,FutureTask现在已经运行并且具有其具体结果 – 因此run()的未来调用是no-ops.

我认为这里的根本问题是直接安排FutureTask似乎没有意义,至少不是你在这里做的方式.如果你想要每五秒钟运行一些代码,那么你绝对应该采用第二种方法. FutureTask体现了(单个!)计算;你没有理由要多次调用它,事实上它是专门缓存结果来防止这种情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读