2013-03-21 56 views
1

所以基本上我有一个主线程,将接受一个套接字,并创建一个DataInputStream对象来接收数据,然后通过这个输入对象到不同的子线程,他们将用它来管理对多线程DataInputStream所接收数据并执行不同的任务。但这是行不通的,因为这两个线程都使用相同的对象来收听,所以当用户发送一些我不知道谁会阅读的内容时。 我的想法到目前为止:JAVA:使用同一个插座

1-创建某种组织者接收传入的请求并将它们重定向到相应的线程(我不太确定如何执行)。

2-当一个线程正在等待一系列传入请求(基于时间)时,它必须睡眠另一个线程,以便它可以接管输入流(我不知道它是否可以完成)。

任何其他的想法或如何实施任何一个?谢谢!

(在最坏的情况下,我会在一个加入两个线程。)

回答

2

我建议你使用ReadWriteLock,利用其API和实例的深入了解。 对于这种情况下加入线程的u可以使用CiclycBarier

CiclycBarrierReadWriteLock

希望这有助于

+0

我已经决定去与ReentrantLoc,但事情是,一个线程会调用客户端如果某些条件为真为客户端发送数据(可以说T1),而其他线程被认为是监听客户请求(t2)。在这种情况下,t1将检查是否未获取锁,然后尝试从套接字读取,其中t2将稍后运行,获取锁并开始通信,但是t1恢复时,它已经在监听,应该停止。 – Khaled 2013-03-21 10:03:50

+0

你的意思是停止监听和发送数据的全部过程,或者只是其中的一个?对于permanet还是仅仅几次? 您是否使用'ExecutorService'设计了这个线程管理? 如果没有,我建议你使用它,并停止所有的过程,你可以调用'shutDown()'和'awaitTermination()'方法。 您应该阅读它们的[API](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html) – 2013-03-22 07:50:18

+0

问题是,当一个线程开始监听时,它不会停止,因此保持锁定并阻止其他线程。 我解决了通过使用套接字超时为听众,这是不美丽,但工作正常..谢谢 – Khaled 2013-03-24 09:05:44

2

我宁愿去与选项1,但你不应该通过数据输入流中的其他对象。相反,我建议从数据输入流中提取数据是一个对象的责任。提取的数据然后可以传递给另一个对象,负责处理它。为了处理数据,你应该看看战略模式。

而且我觉得你的线程的使用是通过使负责一件事每个线程迫使太多的耦合。你不应该担心这一点。相反,你应该有一个Executor。对于每个可接受的套接字,您创建一个传递给执行器的任务。任务本身是通过数据输入流从套接字中提取数据,并创建另一个处理数据的任务。然后这个任务再次被分派给执行者。这样你使你的应用程序更具可测性,因为你不一定依赖多线程。