2011-04-10 57 views
0

我正在做一个项目,我必须让线程通信。Java线程沟通

例如

我有两个线程阵列,c[100]e[10]。 (客户和员工)

一旦客户说c[3]获取信号,让它与员工的一个发言说员工e[5],我怎么通过线程c[3]代表到Employee对象e[5]Customer对象相关联,并让他们来回传递信息?

+0

可能的重复[与Java线程之间的管道数据](http://stackoverflow.com/questions/5602904/piping-data-between-threads-with-java) – trashgod 2011-04-10 20:55:50

回答

1

对于允许线程之间的通信信息多种技术。最简单的方法是通过共享状态进行互斥。消息队列是最经典的可扩展方法之一。您需要使用的方式取决于作业分配的陈述。

一般来说,保护共享的状态,您的同步原语(无论是互斥或信号或其他),并让非共享状态的正常运行。如果你有员工和顾客,也许他们通过他们共享的“邮件插槽”进行通信。使用您的信号保护邮件插槽,以防止其他人在写入时尝试阅读(反之亦然),并且您将拥有所需的主要策略。

+0

我仍然不确定我理解如何做它。我想解释这个最好的办法就是想到一家杂货店。你有多个客户c [0-99]可以去任何可用的收银员e [0-10]。一旦收银员在他们的结账线上有一位顾客,他们必须通过顾客与收银员沟通食品杂货,然后收银员必须将总数交给给顾客,顾客把食品交给顾客,然后顾客必须看他们的钱包并且制作肯定他们有足够的钱。因此,通过消息队列,您将如何区分应该发送给每个实体的信息? – JustinY17 2011-04-10 21:32:12

+0

所以我想回到原来的问题,我如何关联由每个线程表示的两个对象?带有员工的客户,以便他们可以交换信息。 – JustinY17 2011-04-10 21:33:55

+0

您需要阅读The Java Tutorials on Concurrency http://download.oracle.com/javase/tutorial/essential/concurrency/index.html – 2011-04-10 23:37:53

0

另一个方式是通过消息传递。例如,您可以为一个对象订阅事件的侦听器。当另一个线程引起更改时,它让所有监听者知道该事件,并且所有监听者都会收到通知。

另一种可能的解决方案是使用管道流或管道重做(即PidedInputStrean,PipedOutputStream,PipedReader,PipedWriter)。在这个方案中,一个线程写入管道的一侧,另一个线程读取另一侧。

而且我敢肯定还有其他几种方法来做到这一点。