当前位置: 首页 > 知识库问答 >
问题:

多个线程提交要按顺序完成的操作

赫连卓
2023-03-14

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

概述:我想知道是否有一种方法可以让多个线程向另一个线程负责的队列中添加要执行的操作。实际上,顺序并不重要——更重要的是,队列中的操作一次处理一个。

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

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

此外,如果这不是最好的方法,请提供建议。

非常感谢你。

共有3个答案

白芷阳
2023-03-14

Executor界面提供了所需的抽象:

执行提交的Runnable任务的对象。该接口提供了一种将任务提交与每个任务的运行机制分离的方法,包括线程使用、调度等细节。通常使用执行器来代替显式创建线程。"

单线程执行器服务似乎正是适合这项工作的工具。参见执行者。newSingleThreadExecutor(),其javadoc说明:

创建一个执行器,该执行器使用一个工作线程在一个无界队列上运行。(但是请注意,如果此单线程在关机前的执行过程中由于故障而终止,那么如果需要执行后续任务,将使用一个新线程代替它。)任务保证按顺序执行,并且在任何给定时间都不会有多个任务处于活动状态。与其他等效的newFixedThreadPool(1)不同,返回的执行器保证不可重新配置以使用其他线程。

请注意,在JavaEE上下文中,您需要考虑在卸载webapp时如何终止工作线程。还有其他一些问题需要解决。

贺自明
2023-03-14

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

姬和豫
2023-03-14

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

 类似资料:
  • 问题内容: 我有3个线程第一打印A第二打印B第三打印C 我想按顺序打印ABCABCABC,依此类推..... 因此,我在下面编写了程序,但无法实现相同的目的。我知道一个问题,当时状态为1时,例如B1和C1线程正在等待,而当我做notifyAll()时,两个等待线程都被唤醒,并且取决于CPU分配,它可能会打印B或C。 在这种情况下,我只希望在A之后打印B。 我需要做什么修改。 问题答案: 将那些IF

  • 在我的应用程序中,在程序的整个生命周期中,有n个操作必须依次发生。我决定为每个操作创建一个线程,让它们执行一次run方法,然后等待所有其他线程都执行相同的操作,等待轮到它,然后再次执行,依此类推,而不是创建实现这些操作的方法并在while(true)循环中按顺序调用它们。。。 为了实现这个机制,我创建了一个名为StatusHolder的类,它有一个名为threadTurn的字段(表示应该执行哪个线

  • 问题内容: 我正在尝试在我正在处理的Python项目中使用线程,但是线程似乎没有按照我的代码的预期运行。似乎所有线程都按顺序运行(即,线程2在线程1结束后开始,它们不是同时启动)。我编写了一个简单的脚本来对此进行测试,并且该脚本也按顺序运行线程。 这是我从运行它得到的输出: 循环的迭代次数更多时,观察到相同的行为。 我尝试搜索网络和较早的SO答案,但找不到任何有帮助的方法。有人可以指出这段代码有什

  • 这就是我试图解决但不确定如何解决的问题:我有一个对象数组(假设大小为100),每个对象都有一些id。 有10个线程将从该数组中读取数据并将其插入数据库。 如何确保数据以递增序列的方式根据员工ID的序列插入数据库。例如: 如果数组中的对象具有员工ID 6、8和4,那么这些对象应该按照员工ID 4、6和8在数据库中的顺序插入数据库。如何为此编写多线程代码? 更新:请忽略数据库部分,如果它令人困惑,我的

  • 问题内容: 我有以下代码,基本上它正在执行两个操作。第一个是将我的表单数据提交到google电子表格,另一个操作是将我的第二个表单文本框值数据提交到另一个页面文本框值。这个怎么做? 从上面可以看到,这是第一页,第二页是第二种形式的Sankranthi_Reserv2.asp。我想在那儿传递文本框值,所以问题是第一种形式是提交给Google文档并存储数据,但是第二种形式需要将手机号码文本框值传递给下

  • 问题内容: 在我的程序执行过程中,启动了多个线程。线程数量取决于用户定义的设置,但是它们都使用不同的变量执行相同的方法。 在某些情况下,需要在执行过程中进行清理,其中一部分是停止所有线程,尽管我不希望它们立即停止,我只是设置了一个变量来检查它们是否终止。问题在于线程停止之前最多可能需要1/2秒。但是,我需要确保所有线程都已停止,然后才能继续进行清理。清理是从另一个线程执行的,因此从技术上讲,我需要