Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA:使用同一套接字在多个线程上管理DataInputStream_Java_Multithreading_Sockets_Inputstream - Fatal编程技术网

JAVA:使用同一套接字在多个线程上管理DataInputStream

JAVA:使用同一套接字在多个线程上管理DataInputStream,java,multithreading,sockets,inputstream,Java,Multithreading,Sockets,Inputstream,所以基本上我有一个主线程,它将接受一个套接字并创建一个DataInputStream对象来接收数据,然后将这个输入对象传递给不同的子线程,在那里他们将使用它来接收数据并执行不同的任务。但这是行不通的,因为两个线程都使用同一个对象来侦听,所以当用户发送某个内容时,我不知道谁会读它。。 到目前为止,我的想法是: 1-创建某种管理器,接收传入的请求并将它们重定向到负责的线程。我真的不知道如何做 2-当一个线程根据时间期待一系列传入请求时,它必须睡眠另一个线程,以便它可以接管inputstream,我不

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

1-创建某种管理器,接收传入的请求并将它们重定向到负责的线程。我真的不知道如何做

2-当一个线程根据时间期待一系列传入请求时,它必须睡眠另一个线程,以便它可以接管inputstream,我不确定这是否可以完成

还有其他想法吗?或者如何实现其中一个?谢谢

在最坏的情况下,我将不得不在一个线程中连接两个线程。

我建议您使用ReadWriteLock,深入查看它的api和示例。 对于连接线程的这种情况,可以使用CiclyBarier

希望这有帮助

我建议您使用ReadWriteLock,深入了解它的api和示例。 对于连接线程的这种情况,可以使用CiclyBarier


希望这有帮助

我宁愿选择选项1。但不应将数据输入流传递给其他对象。相反,我认为从数据输入流中提取数据是一个对象的责任。然后,可以将提取的数据传递给负责处理它的另一个对象。为了处理数据,您应该查看策略模式


另外,我认为线程的使用迫使每个线程负责一件事情,从而导致了太多的耦合。你不应该担心那件事。相反,你应该有一个健康的身体。对于每个接受的套接字,您创建一个传递给执行器的任务。任务本身通过数据输入流从套接字提取数据,并创建另一个用于处理数据的任务。然后,该任务再次分派给执行者。这样可以使应用程序更易于测试,因为您不必依赖多个线程。

我宁愿选择选项1。但不应将数据输入流传递给其他对象。相反,我认为从数据输入流中提取数据是一个对象的责任。然后,可以将提取的数据传递给负责处理它的另一个对象。为了处理数据,您应该查看策略模式


另外,我认为线程的使用迫使每个线程负责一件事情,从而导致了太多的耦合。你不应该担心那件事。相反,你应该有一个健康的身体。对于每个接受的套接字,您创建一个传递给执行器的任务。任务本身通过数据输入流从套接字提取数据,并创建另一个用于处理数据的任务。然后,该任务再次分派给执行者。通过这种方式,您可以使应用程序更易于测试,因为您不必依赖多个线程。

我决定使用ReentrantLoc,但问题是,如果客户端发送数据的某些条件为真,其中一个线程将调用客户端,比如t1,而另一个线程应该监听客户机请求t2。在这种情况下,t1将检查是否未获取锁,然后尝试从套接字读取,t2稍后将在套接字中运行,获取锁并开始通信,但当t1返回时,它已经在侦听,应该停止。您的意思是停止所有侦听和发送数据的过程,还是仅停止其中一个?是永久性的还是仅仅几次?您是否使用ExecutorService设计此线程管理?如果没有,我建议您使用它,并停止您可以调用shutDown和waittermination方法的所有进程。你应该了解到他们的牙齿问题是,当一个线程开始侦听时,它不会停止,从而保持锁并阻塞其他线程。我通过为侦听器使用套接字超时解决了这个问题,它虽然不美观,但工作正常。。感谢正如我在回答中所说的,您必须使用ReadWriteLock这个类设计来使用两个单独的锁来管理服务,这两个锁是ReadLock和WriteLock。您只需通过1个锁设计2个服务,当然这会导致死锁。Java提供了如此漂亮的API,你应该试试,否则你会后悔的:PI已经决定使用ReentrantLoc,但问题是,如果客户端发送数据的某些条件为真,那么其中一个线程将调用客户端,比如t1,而另一个线程则应该侦听客户端请求t2。在这种情况下,t1将检查是否未获取锁,然后尝试从套接字读取,t2稍后将在套接字中运行,获取锁并开始通信,但当t1返回时,它已经在侦听,应该停止。您的意思是停止所有侦听和发送数据的过程,还是仅停止其中一个?是给你的吗
永久的还是仅仅几次?您是否使用ExecutorService设计此线程管理?如果没有,我建议您使用它,并停止您可以调用shutDown和waittermination方法的所有进程。你应该了解到他们的牙齿问题是,当一个线程开始侦听时,它不会停止,从而保持锁并阻塞其他线程。我通过为侦听器使用套接字超时解决了这个问题,它虽然不美观,但工作正常。。感谢正如我在回答中所说的,您必须使用ReadWriteLock这个类设计来使用两个单独的锁来管理服务,这两个锁是ReadLock和WriteLock。您只需通过1个锁设计2个服务,当然这会导致死锁。Java提供了如此漂亮的API,你应该试试,否则你会后悔的:P