【问题标题】:Thread Delay using scheduler or Thread.Sleep使用调度程序或 Thread.Sleep 的线程延迟
【发布时间】:2015-10-31 04:29:50
【问题描述】:

在我的应用程序中,我调用第三方供应商网络服务。我需要延迟我的线程处理以实现供应商 Web 服务支持的所需吞吐量。

我有两个选择 1. 使用 Thread.Sleep 2.使用How to start a thread after specified time delay in java帖子中提到的ScheduledThreadPoolExecutor

想知道哪个是更好的选择,因为我们正在使用供应商网络服务发送时间关键信息(文本消息)。 任何帮助表示赞赏。

【问题讨论】:

  • 我们使用 ExecutorService 来创建 fixedThreadPool 并在每个线程中调用 Vendor web-service。
  • 什么是java版本?
  • 你需要延迟线程处理直到 web 服务准备好还是一般延迟?
  • java版本是1.6,一般每个线程延迟100ms

标签: java multithreading delay sleep


【解决方案1】:

使用调度器方式,可以选择固定速率或固定延迟。 看源代码:

    /**
     * Period in nanoseconds for repeating tasks.  A positive
     * value indicates fixed-rate execution.  A negative value
     * indicates fixed-delay execution.  A value of 0 indicates a
     * non-repeating task.
     */
    private final long period;

【讨论】:

    【解决方案2】:

    它们与封装睡眠调用的ScheduledThreadPoolExecutor.scheduleWithFixedDelay 几乎相同。

    由于延迟为 100 毫秒,因此性能差异可以忽略不计。由于线程池,我会选择ScheduledThreadPoolExecutor.scheduleWithFixedDelay。施加在系统上的负载量是可控的,不会有多个线程一起从睡眠中唤醒以争夺资源。

    同样来自doc

    线程池解决了两个不同的问题:它们通常提供 执行大量异步时提高性能 任务,由于减少了每个任务的调用开销,并且它们提供了一个 限制和管理资源的方法,包括线程, 执行任务集合时消耗。每个 ThreadPoolExecutor 还维护了一些基本的统计信息,比如完成的数量 任务。

    【讨论】:

    • 不一样。 Thread.sleep() 是一个低级原语。 ScheduledThreadPoolExecutor 是更高级别的抽象。任何时候你发现自己想调用像sleep() 这样低级的东西时,你应该停下来问:“我是在重新发明轮子吗?”因为你可能是。
    • 是的,但我们在这里谈论的是 100 毫秒延迟,性能差异将在纳秒级别或最差的微秒级别。这几乎可以忽略不计。
    • 我不是在谈论性能。我说的是不要编写无端的代码行。您编写的每一行新代码都是一种责任。如果您可以通过重用已经存在的代码来完成工作,那么您将领先一步。如果您需要安排事件在可预测的未来时间发生,请使用ScheduledThreadPoolExecutor 而不是自己编写。如果您需要防止某些事情过于频繁地发生,请使用com.google.common.util.concurrent.RateLimiter 而不是自己编写等等。
    猜你喜欢
    • 2018-01-14
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多