在下面的场景中使用Thread.sleep()是可取的

时间:2017-07-24 08:22:13

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

我有一个 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秒后运行的异步任务是否更好?在这里,我们还必须有一个线程池来执行这些任务。

3 个答案:

答案 0 :(得分:3)

  

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

如果您的最终用户/应用程序不需要来自webservice调用的任何结果,那么最好不要保留该线程。你应该去asynch方式。

答案 1 :(得分:3)

  

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

是的,是一个更好的选择,因为Thread.sleep(20000);每个请求阻止一个线程。使用预定的线程池,您将任务添加到某种队列,稍后使用常量线程执行它们 - 因此不可能耗尽所有可用线程。

答案 2 :(得分:0)

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

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