在java中的线程之间来回发送对象?

时间:2011-12-02 16:22:24

标签: java multithreading thread-safety

我有多个客户端处理程序线程,这些线程需要将接收到的对象传递给服务器队列,服务器队列将另一种类型的对象传递回发送线程。服务器队列启动并在服务器启动时继续运行。我不确定通知哪个线程机制用于通知客户端处理程序线程的对象被发回。我不打算使用套接字或写入文件。

6 个答案:

答案 0 :(得分:5)

如果您想要实际传递消息,请查看SynchronusQueue。每个线程都将引用该队列,并等待一个线程通过队列传递引用。

这将是线程安全的并且满足您的要求。

虽然如果你只是想让线程读写共享变量,你可以使用normalocity的建议,虽然它的线程安全取决于你如何访问它(通过sychronized或volatile)

答案 1 :(得分:4)

就使用Java可访问对象而言,多线程和单线程之间没有区别。您只需遵循范围规则(公共,私有,受保护),就是这样。多个线程都在同一个进程中运行,因此没有任何特殊的线程范围规则可供了解。

例如,定义一个传入对象的方法,并使该方法可以从另一个线程访问。您想要传递的对象只需要从另一个线程的范围访问。

至于线程安全,you can synchronize your writes,并且在大多数情况下,它将处理事情。线程安全可能会让你的代码变得更复杂,但我认为这会让你开始。

处理对象和生成结果对象的一种方法是使用共享数组或LinkedList作为对象队列,包含要处理的对象以及来自该处理的结果对象。如果没有更具体的细节,你很难详细说明你正在尝试做什么,但大多数线程之间对象的共享访问都归结为线程间方法调用或对象的一些共享集合/队列。

答案 2 :(得分:2)

除非您完全确定它一次只能是一个对象,否则请使用某种队列。

如果您确定它一次只能是一个对象,那么无论如何都要使用某种Queue。 : - )

答案 3 :(得分:0)

只需使用简单的dependency injection即可。

MyFirstThread extends Thread{
 public void setData(Object o){...}
}
MySecondThread extends Thread{
   MyFirstThread callback;
   MySecondThread(MyFirstThread callback){this.callback=callback)
}
MyFirstThread t1 = new MyFirstThread();
MySecondThread t2 = new MySecondThread(t1);    
t1.start();
t2.start();

您现在可以在第二个帖子中执行callback.setData(...)

我发现这是最安全的方式。其他解决方案涉及使用volatile或某种共享对象,我认为这是一种过度杀伤力。

您可能还想使用BlockingQueue并将这两个传递给每个线程。如果您计划拥有多个线程,那么它可能是更好的解决方案。

答案 4 :(得分:0)

  • 使用java.util.concurrent。*。
  • 中的并发队列

为什么呢?几乎可以保证提供比手动轧制的任何东西更好的一般性能。

建议:使用绑定队列,您将免费获得背压。

注意:队列深度决定了您的一般延迟特性:较浅的队列将以较低的带宽为代价具有较低的延迟。

  • 使用未来语义

为什么呢?期货提供了一种经过验证的标准方法来获得异步结果。

建议:创建一个简单的Request类并公开一个方法#getFutureResponse()。该方法的实现可以使用各种信令策略,如Lock,flag(使用Atomic / CAS)等。

注意:在Future中使用超时语义将允许您将服务器行为链接到服务器SLA,例如#getFutureResponse(sla_timeout_ms)。

答案 5 :(得分:0)

如果您想更深入地了解线程(或进程或系统)之间的通信,请提供一本书的提示:Pattern-Oriented Software Architecture Volume 2: Patterns for Concurrent and Networked Objects