【发布时间】:2012-03-16 04:05:25
【问题描述】:
我有 2 个线程,它们通过消息队列进行通信。
如果我执行以下操作:
Messenger mess = new Messenger(); //Create an object of type Messenger
....
controller.enqueue(mess); //Adds it's reference to a message queue from another thread
....
mess = new Messenger(); //Create another object of type Messenger
....
controller.enqueue(mess); //Adds it's reference AS WELL to the message queue of another thread
我的问题是: 这行得通吗?来自控制器的消息队列中是否有 2 个对象? (实际上是对 2 个对象的 2 个引用)?还是只有一个,第二个?第二个对象创建是否会以某种方式覆盖第一个对象?
【问题讨论】:
-
这完全取决于
controller.enqueue()的作用。阅读它的 javadoc。鉴于它的名字,我猜想 enqueue 将参数添加到队列中。而且“添加”并不意味着“替换最后一个元素”。但我只能猜测。 -
实际上控制器是一个 Runnable 并且 enqueue 是我自己创建的消息队列类的方法。所以 enqueue 把它得到的对象放入一个 ArrayList
-
ArrayList.add() 确实将其参数添加到列表中。阅读它的 javadoc。
-
如果你想使用带线程的工作队列,我会使用 ExecutorService。这是线程安全的、经过测试的、内置的,并为您提供了一个队列和一个线程池(可以只是一个)
-
对不起,如果我的评论令人讨厌。但说真的,根本没有人能以你提出的形式回答你提出的问题。你看到了吗?所以问真的没意义!确实,在您对 A.H. 的回答的第一条评论中,您明确表示这个问题根本不是关于线程或队列的,而是关于 Java 中变量的基本行为。这本来是一个很好的问题。
标签: java multithreading instance message-queue