【问题标题】:Is using Thread.sleep() advisable in the below scenario在以下情况下建议使用 Thread.sleep()
【发布时间】:2017-12-29 17:50:05
【问题描述】:

我有一个调用这个方法的webservice

public void process(Incoming incoming) {
   // code to persist data
   ...
   Thread.sleep(20000);
   // check persisted data and if status != CANCELLED then process
}

要求是我必须等待20秒(因为业务很可能会在20秒内发送取消请求,这种情况我们不应该处理)。

我知道 Thread.sleep() 在时间到之前甚至不会打扰 cpu。

  • 但令人担忧的是,由于它是从 Web 服务调用的,因此这些线程可能来自某种池,如果大量请求到来,可能会耗尽?
  • 或者新的 servlet 容器是否会在耗尽时自动创建额外的线程,而我们可以编写这种代码而不用担心这些事情?
  • 调度一个在 20 秒后运行的异步任务是不是更好的选择?同样,无论如何,我们必须有一个线程池来执行这些任务。

【问题讨论】:

    标签: java asynchronous threadpool thread-sleep servlet-container


    【解决方案1】:

    是否调度一个在 20 秒后运行的异步任务 更好的选择?同样,我们必须有一个线程池来执行 无论如何,这些任务。

    是的,这是更好的选择,因为使用Thread.sleep(20000);,每个请求都会阻塞一个线程。使用调度线程池,您将任务添加到某种队列中,然后使用恒定数量的线程执行它们 - 因此不可能耗尽所有可用线程。

    【讨论】:

      【解决方案2】:

      调度一个在 20 秒后运行的异步任务是不是更好的选择?在这里,无论如何,我们必须有一个线程池来执行这些任务。

      如果您的最终用户/应用程序不需要 Web 服务调用的任何结果,那么最好不要保留线程。您应该采用异步方式。

      【讨论】:

      • hmm .. 谢谢@Shinchan 最终用户不需要回复...这就是我返回 void 的原因...您如何看待问题 #1 和 #2
      【解决方案3】:

      或者新的 servlet 容器是否会在耗尽时自动创建额外的线程,我们可以编写这种代码而不用担心这些事情?

      要自定义此线程池的大小,您应该在application.propertiesapplication.xml 文件中为server.tomcat.max-threads 属性指定一个非零值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-06
        • 1970-01-01
        相关资源
        最近更新 更多