Java 单一生产商-多个不同的消费者
我正在做一个uni项目,关于一个打算在医院使用的计算机系统 我有一个Java 单一生产商-多个不同的消费者,java,multithreading,concurrency,producer-consumer,blockingqueue,Java,Multithreading,Concurrency,Producer Consumer,Blockingqueue,我正在做一个uni项目,关于一个打算在医院使用的计算机系统 我有一个Patient的TreeSet,其中存储了在医院康复的所有患者。类患者除其他数据外,还有一些与之相关的重要参数。 除了主线程外,我还有三个线程生成每个患者的重要参数:我有一个线程每2分钟生成一次血压,一个线程每5分钟生成一次心跳,还有一个线程每3分钟生成一次体温。 在线程中,我有一个阻塞队列患者,其中每个新的患者都是由生产者添加的,线程必须为每个患者执行上述操作 问题是我恐怕还不太了解生产者-消费者模式 我的消费者是三个线程,但
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()
方法时,第一个患者的每个线程都被阻塞。也许我应该像你说的那样使用多个任务,但是对于每个线程?对不起,如果我完全弄错了。