【问题标题】:guarantee thread execution order is first come first serve保证线程执行顺序是先到先服务
【发布时间】:2011-03-28 17:39:10
【问题描述】:

我有从调用外部服务的 servlet 调用的代码。当然,不能保证服务需要多长时间才能返回响应。我需要确保一次对该服务的调用不超过一个,但当然 servlet 容器可以对 servlet 运行并发请求。我想保证请求的优先级是在先到先服务器的基础上处理单个文件。因此,我对外部 servlet 的调用被同步是不够的,因为一旦当前调用完成,就无法保证接下来进入哪个线程进行调用。

有什么想法吗?

【问题讨论】:

  • 您无法控制请求到达您的服务器所需的时间,因此您并不真正知道哪个先出现。我不会太担心请求的顺序,只需要它们相互隔离即可。
  • 假设处理第一个请求需要 20 分钟。让 1 秒前的第 n 个请求在 20 分钟前的 1 到 n-1 之前执行是否公平?这样你就可以完全饿死了。 (是的,20 分钟是极端的,会引起其他需要关注的问题)
  • 另外,你是对的,但是我可以通过控制对这个可能长时间运行的资源的访问来缓解问题的程度,而容器的请求不太可能长时间运行(我的应用程序是容器中只有一个)。

标签: java multithreading concurrency


【解决方案1】:

你可以使用公平的锁

Lock lock = new ReentrantLock(true);

这会按照尝试的顺序提供锁定。

【讨论】:

  • 参见 Bloch 等人的 Java 并发实践第 13 章。
  • 这是一个很好的答案@peter.. 但我认为在等待阶段之后锁定工作是公平的.. 意味着在等待阶段有更多时间的线程首先被激活。
  • @Anita Fair 锁定开销更大,速度更慢。这就是为什么它不是默认行为的原因。也就是说,只有当你真的需要它时,你才会使用它。
  • @Vipin 这取决于你是否需要它们。
【解决方案2】:

您可以使用single-threaded ExecutorServicesubmit Callables(将执行实际请求)并等待Future 值到become available

【讨论】:

【解决方案3】:

java.util.concurrent 中的许多实用程序都适合这种情况,带有公平设置的Semaphore 是另一种选择

import java.util.concurrent.*;
Semaphore sem = new Semaphore (int n = HOW_MANY_PERMITS, boolean fairness = true);

【讨论】:

    【解决方案4】:

    在您的 servlet 中创建一个工作线程并在那里将标注排入队列。请求处理将在将请求添加到队列时同步,然后就坐在那里等待工作线程返回报告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      相关资源
      最近更新 更多