Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单一生产商-多个不同的消费者_Java_Multithreading_Concurrency_Producer Consumer_Blockingqueue - Fatal编程技术网

Java 单一生产商-多个不同的消费者

Java 单一生产商-多个不同的消费者,java,multithreading,concurrency,producer-consumer,blockingqueue,Java,Multithreading,Concurrency,Producer Consumer,Blockingqueue,我正在做一个uni项目,关于一个打算在医院使用的计算机系统 我有一个Patient的TreeSet,其中存储了在医院康复的所有患者。类患者除其他数据外,还有一些与之相关的重要参数。 除了主线程外,我还有三个线程生成每个患者的重要参数:我有一个线程每2分钟生成一次血压,一个线程每5分钟生成一次心跳,还有一个线程每3分钟生成一次体温。 在线程中,我有一个阻塞队列患者,其中每个新的患者都是由生产者添加的,线程必须为每个患者执行上述操作 问题是我恐怕还不太了解生产者-消费者模式 我的消费者是三个线程,但

我正在做一个uni项目,关于一个打算在医院使用的计算机系统

我有一个
Patient
TreeSet
,其中存储了在医院康复的所有患者。类
患者
除其他数据外,还有一些与之相关的重要参数。 除了主线程外,我还有三个线程生成每个患者的重要参数:我有一个线程每2分钟生成一次血压,一个线程每5分钟生成一次心跳,还有一个线程每3分钟生成一次体温。 在线程中,我有一个
阻塞队列患者
,其中每个新的
患者
都是由生产者添加的,线程必须为每个
患者
执行上述操作

问题是我恐怕还不太了解生产者-消费者模式

我的消费者是三个线程,但它们是不同类型的类,我有
PressureChanger
TemperatureChanger
HeartBeatChanger
。如果我添加患者,第一个线程从队列中获取第一个患者,第二个线程获取第二个,第三个线程获取第三个,然后如果我插入其他患者,则没有线程获取他们。
它如何处理多个使用者,以及执行不同操作、具有不同方法的不同类,因为使用者使用三个队列?如果你想成为一名花花公子,那么LMax Disruptor会为每个队列项目提供多个操作——对于uni项目来说,这可能有点过头了,也超出了你的并发能力;但是读起来可能很有趣。@Boristespider我想了想,但是没有更有效的解决方案吗?使用三个队列听起来有点像escamotage,但我不是专家,这是我第一次处理Java和并发性。哦,刚刚读到关于LMax干扰器的文章,是的,它看起来和我的能力不一样,但是谢谢你的建议!然后使用三个队列。1) 让它工作,测试通过。2) 重构以获得可扩展性。3) 衡量绩效。4) 决定您是否需要更高的性能,以及在何处。3.队列简洁大方。一个简单的替代方法是完全重写任务,使其具有
患者
,并具有执行所有任务的
任务处理器
。然后将任务放入队列中。因此,现在您有了一个同质工人池和异质任务池,而不是将任务放入队列中的异质工人池。如果这听起来很熟悉,那么它应该是一个
ExecutorService
。因此,您可以只使用其中一个,让您的3个任务
实现可运行的
,您就成功了。正如我上面所说的,也许先用最简单的方法让它工作,然后再重构。三个队列工作,但现在我的问题是,在执行任务之前,我的三个线程都必须睡眠n分钟,为了对每个
患者
执行任务,我使用了for循环
for(患者:患者)
但是当我调用for循环中的
sleep()
方法时,第一个患者的每个线程都被阻塞。也许我应该像你说的那样使用多个任务,但是对于每个线程?对不起,如果我弄错了。一定要排三个队吗?如果你想成为一名花花公子,那么LMax Disruptor会为每个队列项目提供多个操作——对于uni项目来说,这可能有点过头了,也超出了你的并发能力;但是读起来可能很有趣。@Boristespider我想了想,但是没有更有效的解决方案吗?使用三个队列听起来有点像escamotage,但我不是专家,这是我第一次处理Java和并发性。哦,刚刚读到关于LMax干扰器的文章,是的,它看起来和我的能力不一样,但是谢谢你的建议!然后使用三个队列。1) 让它工作,测试通过。2) 重构以获得可扩展性。3) 衡量绩效。4) 决定您是否需要更高的性能,以及在何处。3.队列简洁大方。一个简单的替代方法是完全重写任务,使其具有
患者
,并具有执行所有任务的
任务处理器
。然后将任务放入队列中。因此,现在您有了一个同质工人池和异质任务池,而不是将任务放入队列中的异质工人池。如果这听起来很熟悉,那么它应该是一个
ExecutorService
。因此,您可以只使用其中一个,让您的3个任务
实现可运行的
,您就成功了。正如我上面所说的,也许先用最简单的方法让它工作,然后再重构。三个队列工作,但现在我的问题是,在执行任务之前,我的三个线程都必须睡眠n分钟,为了对每个
患者
执行任务,我使用了for循环
for(患者:患者)
但是当我调用for循环中的
sleep()
方法时,第一个患者的每个线程都被阻塞。也许我应该像你说的那样使用多个任务,但是对于每个线程?对不起,如果我完全弄错了。