1

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

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

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

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

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

非常感谢。

4

3 回答 3

4

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

于 2013-07-13T15:28:32.300 回答
1

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

执行提交的Runnable任务的对象。这个接口提供了一种将任务提交与每个任务将如何运行的机制解耦的方法,包括线程使用、调度等的细节。Executor通常使用 An 而不是显式创建线程。

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

创建一个Executor使用单个工作线程在无界队列上操作的线程。(但请注意,如果该单线程在关闭前的执行过程中因失败而终止,则如果需要执行后续任务,则新线程将取代它。)任务保证按顺序执行,并且不会有多个任务处于活动状态在任何给定时间。与其他等效 newFixedThreadPool(1)的不同,返回的执行程序保证不能重新配置以使用额外的线程。

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

于 2013-07-13T15:46:58.363 回答
1

您可以让线程将任务提交给只有一个线程的 ExecutorService。或者你可以有一个只允许一个线程一次修改文件的锁。后者似乎更自然,因为文件是共享资源。队列是等待锁定的线程的隐含队列。

于 2013-07-13T15:30:20.053 回答