Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
socket编程中的Java线程间通信问题_Java_Multithreading_Sockets_Java Io - Fatal编程技术网

socket编程中的Java线程间通信问题

socket编程中的Java线程间通信问题,java,multithreading,sockets,java-io,Java,Multithreading,Sockets,Java Io,我开始从事Java套接字编程。我已经制作了以下应用程序: 1.客户端向服务器发送消息,服务器在接收时作出响应 2.客户端和服务器像点对点聊天一样聊天 现在我想开发一个应用程序,在这个应用程序中,每当请求到达服务器时,它都会为它生成一个线程。但现在的问题是,我无法识别线程。若一个线程正在发送消息,那个么服务器如何识别来自该客户端的消息,我必须将其转发给该客户端。两个客户端(实际上是它们的线程)如何通信 我搜索了它,找到了synchronized关键字,我知道它的用法,我知道wait()、notif

我开始从事Java套接字编程。我已经制作了以下应用程序: 1.客户端向服务器发送消息,服务器在接收时作出响应 2.客户端和服务器像点对点聊天一样聊天

现在我想开发一个应用程序,在这个应用程序中,每当请求到达服务器时,它都会为它生成一个线程。但现在的问题是,我无法识别线程。若一个线程正在发送消息,那个么服务器如何识别来自该客户端的消息,我必须将其转发给该客户端。两个客户端(实际上是它们的线程)如何通信

我搜索了它,找到了synchronized关键字,我知道它的用法,我知道wait()、notify()和notifyAll(),但我仍然无法提供它们之间的通信

如果我做错了什么,请告诉我有关这方面的知识,或者我需要在开始讨论这个问题之前了解一些概念。
TIA

您不能将数据传递给线程,只能将数据传递给线程正在读取的数据结构

我建议您使用这个简单的模式,每个连接使用两个线程和一个输出队列。这些线程是在接受连接时创建的,并在连接关闭之前运行。如果您有短期连接,则可以使用线程池

每个连接都有一个读卡器线程,该线程从套接字读取数据,直到使用阻塞IO关闭连接为止。此读取线程还处理客户端上的工作

每个连接的另一个线程从BlockingQueue读取它写入套接字的消息

当用户连接时,他们会传递一个唯一的令牌来说明他们是谁,该令牌存储在
ConcurrentMap
中,其中BlockingQueue是该连接的输出队列

这样,每当连接向特定用户发送消息时,您就可以将其添加到与该用户关联的队列中


您可以将此模型简化为使用较少的线程,例如,对于选择器,您只需要一个线程,但这要复杂得多。

您不能将数据传递给线程,只能将数据传递给它们正在读取的数据结构

我建议您使用这个简单的模式,每个连接使用两个线程和一个输出队列。这些线程是在接受连接时创建的,并在连接关闭之前运行。如果您有短期连接,则可以使用线程池

每个连接都有一个读卡器线程,该线程从套接字读取数据,直到使用阻塞IO关闭连接为止。此读取线程还处理客户端上的工作

每个连接的另一个线程从BlockingQueue读取它写入套接字的消息

当用户连接时,他们会传递一个唯一的令牌来说明他们是谁,该令牌存储在
ConcurrentMap
中,其中BlockingQueue是该连接的输出队列

这样,每当连接向特定用户发送消息时,您就可以将其添加到与该用户关联的队列中


您可以将此模型简化为使用较少的线程,例如,使用选择器,您只需要一个线程,但这要复杂得多。

只需为每个客户端线程添加一个ID如何?我也可以添加名称,但我知道如何识别线程?因为我对两个线程使用相同的run()方法。向主线程添加一个方法,该方法将ID传递给它,然后通知()。只向每个客户端线程添加一个ID怎么样?我也可以添加名称,但我知道如何识别线程?因为我对两个线程使用相同的run()方法。向主线程添加一个方法,该方法将ID传递给它,然后通知()。我知道Peter Lawrey线程不能直接通信,但可以通过共享资源进行通信。顺便说一句,我还知道有与每个客户机线程相关联的输入和输出流。我发现你的ConcurrentMap建议很有趣。我试试看。如果您可以在我可以学习的地方共享视频链接或任何与之相关的资源,那么我将非常感谢您。:)@SandePDASS当你有一个新连接时,使用
Map.put
,当你想找到它的队列时,使用
Map.get
,当你关闭连接时,使用
Map.remove
我建议你阅读该类及其父类的Javadoc。我知道Peter Lawrey,线程不能直接通信,但可以通过共享资源进行通信。顺便说一句,我还知道有与每个客户机线程相关联的输入和输出流。我发现你的ConcurrentMap建议很有趣。我试试看。如果您可以在我可以学习的地方共享视频链接或任何与之相关的资源,那么我将非常感谢您。:)@SandePDASS当你有一个新连接时,使用
Map.put
,当你想找到它的队列时,使用
Map.get
,当你关闭连接时,使用
Map.remove
我建议你阅读该类及其父类的Javadoc。