【问题标题】:running two threads simultaneously inside a stateless agent and guaranting communication between them在无状态代理中同时运行两个线程并保证它们之间的通信
【发布时间】:2015-08-07 09:20:41
【问题描述】:

我正在用 Java 开发一个 无状态 代理,它从一个服务器获取信息并将其传输到另一个客户端。这意味着代理位于客户端和服务器之间。所以我想在代理上运行两个线程同时:一个线程 (thread1) 运行 serverSocket 并从客户端获取请求,而另一个线程 (thread2) 正在运行并与服务器进行通信。问题在于两个线程之间的同步。我正在考虑让线程 1 在整个时间线程 2 中询问新信息。如果线程 2 没有新内容,他将不会回答。什么是它们之间同步的最佳方式。我应该使用全局变量(标志)在它们之间进行同步吗?拥有无国籍代理时可以保存信息吗?

【问题讨论】:

  • 这是一个非常宽泛的问题,但我建议您查看java.util.concurrent.Exchanger<V>,看看这是否能让您走上正轨,然后在遇到问题时提出更具体(且可回答)的问题。
  • 更多的是关于概念。然后我会根据技术来决定如何实现它

标签: java multithreading synchronization agent


【解决方案1】:

我认为您应该将您的应用修改为异步模型

您的应用需要:
- 接受传入连接的入口点 -> 一个很好的例子是异步 servlet(或一个专用线程)。
- 提供固定数量的工作线程和阻塞队列的 ThreadPoolExecutor(使用 this 构造函数)。

工作流程:

  1. 接受传入请求。
  2. 将传入请求包装到(可运行)任务中。
  3. 将任务放入阻塞队列。
  4. 如果 ThreadPoolExecutor 有空闲的 worker 开始处理任务

这种模型的一个优点是您能够使用一个线程处理一个请求。所以不需要手动同步任何东西。

【讨论】:

  • 当这些工人完成他们的任务时,应该如何以及谁应该将结果发送给代理。 ?
  • @amitakCs 如果您将特定的“响应对象”作为参数之一传递给您的(可运行)任务,那么工作人员应该能够回答代理。在 Servlet 的情况下,“响应对象”是 ServletResponse 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 2015-02-24
  • 2011-10-18
  • 1970-01-01
相关资源
最近更新 更多