我是java新手,在线程消息传递方面遇到了一个问题。我这里的意思是-我有4个线程,一个线程从网络读取消息,并根据消息的类型将消息传递给解析器线程或数据库线程。数据库线程执行一些操作,并且必须将消息发送回第一个将其放入套接字的网络线程。类似地,解析器线程还执行一些操作,并根据结果将消息发送回网络线程或数据库线程。我试过的东西-
我读过关于notify()wait()线程通信的文章,在我的例子中没有帮助,因为我需要一对一的消息传递它的not braodcast all
我读过关于concurrentqueues blockingqueues的文章-因为这不是一个理想的生产者-消费者问题,其中一个线程正在生成MSG,而其他线程正在从中读取-我不能使用这个。使用这将像我需要有5个队列为每个通信通道
network->db,
db->network,
parser->network,
parser->db
这样做有效率吗?
在c++中,我使用的是msging机制,我过去只将msg(windows msg)发布到相应线程的msg池中,而它的msging池中的线程将获取它
有没有像java中的消息传递这样的机制我可以使用?
1条答案
按热度按时间x7rlezfr1#
一个线程从网络中读取消息,并根据消息的类型将消息传递给…数据库线程。数据库线程执行一些操作,并且必须将消息发送回第一个将其放入套接字的网络线程。
您让“网络”线程负责等待来自网络的消息,同时也负责等待来自“数据库”线程的消息。太尴尬了。你可能会发现,要以一种干净、令人满意的方式做到这一点,有点困难,也不可能。
我个人的观点是,多线程程序中的每个长寿命线程应该只等待一件事。
让数据库线程“将消息发送回[要放入的]第一个网络线程”到套接字中的原因是什么?为什么数据库线程本身不能将消息放入套接字中?
如果数据库有充分的理由不发送消息,那么为什么不能将“将消息放入套接字”作为数据库线程提交给线程池的任务呢?
我已经读过关于notify()wait()for thread communication的文章,但在我的例子中没有帮助
你愿意吗
BlockingQueue
救命啊?我读过关于concurrentqueues blockingqueues的文章-因为这不是一个理想的生产者-消费者问题,其中一个线程正在生成MSG,而其他线程正在从中读取-我不能使用这个。使用这将像我需要有5个队列为每个通信通道。
然后呢?如果向程序中添加更多的队列或线程可以使这些线程所做的工作更简单,或者使那些队列的解释更容易理解,那会是一件坏事吗?
关于的注解
wait()
以及notify()
. 这些都是低层次的方法,旨在以一种非常具体的方式来构建更高层次的机制。我不知道标准的javaBlockingQueue
实现实际上使用wait()
以及notify()
但实施一项BlockingQueue
它确实使用了这种机制。所以,如果BlockingQueue
解决你的问题,那就意味着wait()
以及notify()
解决你的问题。你只是没有看到解决办法。事实上,我愿意打赌
wait()
以及notify()
可以用来解决任何需要一个线程等待另一个线程的问题。只是看看你还需要围绕他们做些什么。