【问题标题】:Java - thread PoolJava - 线程池
【发布时间】:2013-04-19 02:12:30
【问题描述】:

我的预定线程池--->

private static ScheduledExecutorService pendingCheckScheduler = Executors.newScheduledThreadPool(1);

线程 1--->

private ScheduledFuture<?> pendingTranStatusCheckHandle=pendingCheckScheduler.scheduleAtFixedRate(new PendingTranStatusCheck(),0,checkForPendingTrans,TimeUnit.SECONDS );

线程2--->

private ScheduledFuture<?> forcibleBatchCloseHandle=pendingCheckScheduler.schedule(new ForcibleBatchClose(), waitForPendingTrans, TimeUnit.MINUTES);

Thread 1 每 10 秒执行一次。Thread 2 应该在 30 分钟后开始。

Thread 1 的行为符合预期,而 Thread2 预计在 30 分钟后开始,而在 1 小时后开始。

thread1 中的延迟是否会导致此问题?如果是这样,考虑到线程池中只有一个线程,thread2 应该在线程 1 完成时具有优先级。为什么Thread2 被拉伸太长1 小时后开始?

我一无所知,期待一些指点。请帮助我。

【问题讨论】:

  • 您应该将代码块用于真实代码。排除“Thread 1-->”让他们成为评论的东西。换行符也有助于提高可读性。
  • 好的。我会在下一篇文章中按照您的指示进行操作。不知怎的,我忘记了。

标签: java scheduled-tasks threadpool threadpoolexecutor


【解决方案1】:

您的概念略有偏差,这抵消了您的结论。您总共有 一个线程,并且计划在该线程上运行两个 任务。因此,如果重复的任务执行很长时间,占用线程,你肯定可以预料到干扰。

【讨论】:

    【解决方案2】:

    这是因为你在执行器中有一个线程。

    Executors.newScheduledThreadPool(1);
    

    它会导致第二个 Runnable 等待直到第一个 Runnable 完成。

    尝试使用两个线程:

    Executors.newScheduledThreadPool(2);
    

    【讨论】:

    • 谢谢..如果第二个可运行对象正在等待,它应该等待多长时间?这第二个可运行对象等待是否有可能在某个时间到期?
    • 第二个 Runnable 不会过期,会一直等到线程空闲(第一个 Runnable 完成)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 2017-12-29
    • 2011-11-16
    • 1970-01-01
    相关资源
    最近更新 更多