多个线程按顺序提交要执行的操作



关于在java中使用线程的问题(免责声明 - 我对线程不是很有经验,所以请留出一些余地(。

概述:我想知道是否有办法让多个线程将要执行的操作添加到另一个线程会处理的队列中。 什么顺序并不重要 - 更重要的是一次处理一个队列中的操作。

解释:我计划托管一个小型服务器(使用 servlet(。 我希望与客户端的每个连接都由单独的线程处理(到目前为止还可以(。 但是,这些线程/客户端中的每一个都将对单个 xml 文件进行更改。 但是,不能同时进行更改。

问题:我可以让每个线程将要进行的更改提交到另一个线程将持续管理的队列中吗? 正如我所说,更改的顺序无关紧要,只是它们不会同时发生。

另外,请告知这是否不是最好的方法。

谢谢。

这是一个合理的方法。 使用无界BlockingQueue(例如LinkedBlockingQueue( - 对 XML 文件执行 IO 的线程调用队列上的take以删除下一条消息(如果队列为空则阻塞(,然后处理消息以修改 XML 文件,而提交对 XML 文件的更改的线程将在队列上调用offer以将其消息添加到队列中。 该BlockingQueue是线程安全的,因此线程无需对其执行同步。

您可以让线程将任务提交到只有一个线程的执行器服务。或者,您可以使用一个只允许一个线程一次更改文件的锁。后者似乎更自然,因为该文件是共享资源。队列是等待锁定的线程的隐含队列。

Executor 接口提供了您需要的抽象:

执行已提交Runnable任务的对象。此接口提供了一种将任务提交与每个任务的运行方式分离的方法,包括线程使用、调度等的详细信息。通常使用Executor,而不是显式创建线程。

单线程执行器服务似乎是完成这项工作的正确工具。 参见Executors.newSingleThreadExecutor(),其javadoc说:

创建一个Executor,该使用单个工作线程在 无限队列。(但请注意,如果此单个线程终止 由于在关闭前执行期间出现故障,新的将 如果需要执行后续任务,请取而代之。任务是 保证按顺序执行,并且不会超过一个任务 在任何给定时间处于活动状态。与其他等效物不同 newFixedThreadPool(1)返回的遗嘱执行人保证不会 可重新配置以使用其他线程。

请注意,在 JavaEE 上下文中,您需要考虑如何在卸载 Web 应用程序时终止工作线程。 关于SO还有其他问题可以解决这个问题。

最新更新