关于在java中使用线程的问题(免责声明 - 我对线程不太熟悉,所以请留出一些余地)。
概述: 我想知道是否有多种方法可以让多个线程添加要执行的操作到另一个线程将要处理的队列。真正的顺序并不重要 - 更重要的是,队列中的操作一次只能处理一个。
说明: 我计划托管一个小型服务器(使用servlet)。我希望每个客户端的连接都由一个单独的线程处理(到目前为止)。但是,这些线程/客户端中的每一个都将对单个xml文件进行更改。但是,这些更改不能同时进行。
问题: 我可以让每个线程提交对另一个线程将持续管理的队列所做的更改吗?正如我所说,改变顺序并不重要,只是它们不会同时发生。
此外,请告知这是不是最好的方法。
非常感谢。
答案 0 :(得分:4)
这是一种合理的方法。使用无界BlockingQueue
(例如LinkedBlockingQueue
) - 在XML文件上执行IO的线程调用队列上的take
以删除下一条消息(如果队列为空则阻塞)然后处理修改XML文件的消息,而提交对XML文件的更改的线程将调用队列上的offer
以便向其添加消息。 BlockingQueue
是线程安全的,因此您的线程无需对其执行同步。
答案 1 :(得分:1)
您可以让线程将任务提交给只有一个线程的ExecutorService。或者您可以拥有一个只允许一个线程同时更改文件的锁。后者似乎更自然,因为文件是共享资源。队列是等待锁定的隐含线程队列。
答案 2 :(得分:1)
Executor
接口提供了您需要的抽象:
执行提交的
Runnable
任务的对象。此接口提供了一种将任务提交与每个任务运行方式的机制分离的方法,包括线程使用,调度等的详细信息。通常使用Executor
而不是显式创建线程。“
单线程执行程序服务似乎是完成工作的正确工具。见Executors.newSingleThreadExecutor()
,其javadoc说:
创建一个使用单个工作线程运行的
Executor
无界队列。 (但请注意,如果此单个线程终止 由于在关机之前执行期间出现故障,新的将会 如果需要执行后续任务,取而代之。)任务是 保证按顺序执行,并且不会超过一个任务 在任何给定时间都有效。不同于其他等同物newFixedThreadPool(1)
保证不会返回执行者 可重新配置以使用其他线程。
请注意,在JavaEE上下文中,您需要考虑在卸载webapp时如何终止工作线程。有other questions here on SO处理此问题。