Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.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线程管理套接字并运行类方法_Java_Multithreading_Sockets - Fatal编程技术网

Java线程管理套接字并运行类方法

Java线程管理套接字并运行类方法,java,multithreading,sockets,Java,Multithreading,Sockets,我启动了一个Java线程,因此它一直在侦听套接字(考虑到套接字读取正在阻塞线程) 线程从套接字接收数据后,需要从类调用方法 现在,我有两个选项可以执行此操作: 声明传递给线程并在类中实现的接口。当线程调用接口方法时,实现类将运行它 或者我可以将类实例作为参数传递给线程,然后调用类方法 但是我想知道当方法运行时线程是否阻塞 我想是的,但我不确定 我希望线程具有套接字事件行为。我的意思是只负责从调用线程的主类中的套接字和fire函数读取数据。是的,线程在执行方法时会阻塞,因此它不能同时从套接字读取数

我启动了一个Java线程,因此它一直在侦听套接字(考虑到套接字读取正在阻塞线程)

线程从套接字接收数据后,需要从类调用方法

现在,我有两个选项可以执行此操作:

声明传递给线程并在类中实现的接口。当线程调用接口方法时,实现类将运行它

或者我可以将类实例作为参数传递给线程,然后调用类方法

但是我想知道当方法运行时线程是否阻塞

我想是的,但我不确定


我希望线程具有套接字事件行为。我的意思是只负责从调用线程的主类中的套接字和fire函数读取数据。

是的,线程在执行方法时会阻塞,因此它不能同时从套接字读取数据。不会丢失任何信息,传输只需要更长的时间,如果计算时间过长,您可以获得套接字超时


如果您的方法需要花费很多时间来运行,那么您应该在另一个工作线程中执行它。我建议为此使用。

是的,线程在执行方法时会阻塞,因此它不能同时从套接字读取。不会丢失任何信息,传输只需要更长的时间,如果计算时间过长,您可以获得套接字超时

如果您的方法需要花费很多时间来运行,那么您应该在另一个工作线程中执行它。我建议使用一个新的

但是我想知道当方法运行时线程是否阻塞

是的,它会阻塞。
如果在
run
内部调用一个方法来处理某个东西,那么它是否是一个接口等都无关紧要,因为你问它,它只关心该方法实际做了什么

在您的情况下,您只有一个选项。
确保尽快将控件返回到套接字侦听线程。
这可以通过设计/强制处理类在不同线程中处理来实现。
其实你的问题不是什么新鲜事。在基于事件的设计中,要求尽可能快地处理事件,以免阻塞基于事件队列的流。
这就是我推荐你设计arround的方式。不使用任何接口与侦听线程交互,而是注册事件侦听器

当事件发生时,即您的侦听线程读取数据时,它会将数据作为事件传递给您的侦听器,此时它当然会阻塞。
然后,您应该启动一个新线程来进行处理,侦听线程可以继续其工作

但是我想知道当方法运行时线程是否阻塞

是的,它会阻塞。
如果在
run
内部调用一个方法来处理某个东西,那么它是否是一个接口等都无关紧要,因为你问它,它只关心该方法实际做了什么

在您的情况下,您只有一个选项。
确保尽快将控件返回到套接字侦听线程。
这可以通过设计/强制处理类在不同线程中处理来实现。
其实你的问题不是什么新鲜事。在基于事件的设计中,要求尽可能快地处理事件,以免阻塞基于事件队列的流。
这就是我推荐你设计arround的方式。不使用任何接口与侦听线程交互,而是注册事件侦听器

当事件发生时,即您的侦听线程读取数据时,它会将数据作为事件传递给您的侦听器,此时它当然会阻塞。

然后,您应该启动一个新线程来进行处理,侦听线程可以继续其工作

您有多种选择:

  • 使您的类成为线程的子类(更简单的代码,但您将把Functional部分(您的主代码)与技术方面(扩展线程)合并在一起)
  • 让你的类实现Runnable接口,并用它启动一个新线程(我经常这样做)。因此,主代码仍然保留在重写的run方法中,但继承树由您决定(您的主类可以扩展另一个类中的一个)
  • 将主代码/线程与两个类分开(一个用于主代码,一个用于线程),随意链接这两个类(请记住,如果在另一个类中创建一个内线程,则内线程可以使用任何最终属性,例如)
如其他答案所述,run()方法中发生的任何事情都会阻塞执行

作为旁注,如果您要处理线程和套接字,我强烈建议您查看一下NIO框架,它就是针对这种行为的:通过NewIO套接字的事件驱动的客户机/服务器应用程序

另一方面,我经常使用这种模式:

  • 启动捕获事件的采集线程
  • 将它们放入linkedblockingqueue(queue.offer())中
  • 让另一个线程共享同一个linkedblockingqueue(使用queue.take()):此操作正在阻止,只要队列为空,线程就会被阻止

这是一种非常简单的方法,一个线程作为“生产者”,一个线程作为“消费者”。您甚至可以让不同的消费者在同一队列中等待。

您有多种选择:

  • 使您的类成为线程的子类(更简单的代码,但您将把Functional部分(您的主代码)与技术方面(扩展线程)合并在一起)
  • 让你的类实现Runnable接口,并用它启动一个新线程(我经常这样做)。因此,您的主代码仍然保留在重写的run方法中,但继承树由您决定(您的主代码)