Java线程管理套接字并运行类方法
我启动了一个Java线程,因此它一直在侦听套接字(考虑到套接字读取正在阻塞线程) 线程从套接字接收数据后,需要从类调用方法 现在,我有两个选项可以执行此操作: 声明传递给线程并在类中实现的接口。当线程调用接口方法时,实现类将运行它 或者我可以将类实例作为参数传递给线程,然后调用类方法 但是我想知道当方法运行时线程是否阻塞 我想是的,但我不确定Java线程管理套接字并运行类方法,java,multithreading,sockets,Java,Multithreading,Sockets,我启动了一个Java线程,因此它一直在侦听套接字(考虑到套接字读取正在阻塞线程) 线程从套接字接收数据后,需要从类调用方法 现在,我有两个选项可以执行此操作: 声明传递给线程并在类中实现的接口。当线程调用接口方法时,实现类将运行它 或者我可以将类实例作为参数传递给线程,然后调用类方法 但是我想知道当方法运行时线程是否阻塞 我想是的,但我不确定 我希望线程具有套接字事件行为。我的意思是只负责从调用线程的主类中的套接字和fire函数读取数据。是的,线程在执行方法时会阻塞,因此它不能同时从套接字读取数
我希望线程具有套接字事件行为。我的意思是只负责从调用线程的主类中的套接字和fire函数读取数据。是的,线程在执行方法时会阻塞,因此它不能同时从套接字读取数据。不会丢失任何信息,传输只需要更长的时间,如果计算时间过长,您可以获得套接字超时
如果您的方法需要花费很多时间来运行,那么您应该在另一个工作线程中执行它。我建议为此使用。是的,线程在执行方法时会阻塞,因此它不能同时从套接字读取。不会丢失任何信息,传输只需要更长的时间,如果计算时间过长,您可以获得套接字超时 如果您的方法需要花费很多时间来运行,那么您应该在另一个工作线程中执行它。我建议使用一个新的 但是我想知道当方法运行时线程是否阻塞 是的,它会阻塞。
如果在
run
内部调用一个方法来处理某个东西,那么它是否是一个接口等都无关紧要,因为你问它,它只关心该方法实际做了什么
在您的情况下,您只有一个选项。确保尽快将控件返回到套接字侦听线程。
这可以通过设计/强制处理类在不同线程中处理来实现。
其实你的问题不是什么新鲜事。在基于事件的设计中,要求尽可能快地处理事件,以免阻塞基于事件队列的流。
这就是我推荐你设计arround的方式。不使用任何接口与侦听线程交互,而是注册事件侦听器 当事件发生时,即您的侦听线程读取数据时,它会将数据作为事件传递给您的侦听器,此时它当然会阻塞。
然后,您应该启动一个新线程来进行处理,侦听线程可以继续其工作 但是我想知道当方法运行时线程是否阻塞 是的,它会阻塞。
如果在
run
内部调用一个方法来处理某个东西,那么它是否是一个接口等都无关紧要,因为你问它,它只关心该方法实际做了什么
在您的情况下,您只有一个选项。确保尽快将控件返回到套接字侦听线程。
这可以通过设计/强制处理类在不同线程中处理来实现。
其实你的问题不是什么新鲜事。在基于事件的设计中,要求尽可能快地处理事件,以免阻塞基于事件队列的流。
这就是我推荐你设计arround的方式。不使用任何接口与侦听线程交互,而是注册事件侦听器 当事件发生时,即您的侦听线程读取数据时,它会将数据作为事件传递给您的侦听器,此时它当然会阻塞。
然后,您应该启动一个新线程来进行处理,侦听线程可以继续其工作您有多种选择:
- 使您的类成为线程的子类(更简单的代码,但您将把Functional部分(您的主代码)与技术方面(扩展线程)合并在一起)
- 让你的类实现Runnable接口,并用它启动一个新线程(我经常这样做)。因此,主代码仍然保留在重写的run方法中,但继承树由您决定(您的主类可以扩展另一个类中的一个)
- 将主代码/线程与两个类分开(一个用于主代码,一个用于线程),随意链接这两个类(请记住,如果在另一个类中创建一个内线程,则内线程可以使用任何最终属性,例如)
- 启动捕获事件的采集线程李>
- 将它们放入linkedblockingqueue(queue.offer())中李>
- 让另一个线程共享同一个linkedblockingqueue(使用queue.take()):此操作正在阻止,只要队列为空,线程就会被阻止李>
这是一种非常简单的方法,一个线程作为“生产者”,一个线程作为“消费者”。您甚至可以让不同的消费者在同一队列中等待。您有多种选择:
- 使您的类成为线程的子类(更简单的代码,但您将把Functional部分(您的主代码)与技术方面(扩展线程)合并在一起)
- 让你的类实现Runnable接口,并用它启动一个新线程(我经常这样做)。因此,您的主代码仍然保留在重写的run方法中,但继承树由您决定(您的主代码)