java - Java如何处理线程中的公共(public)方法

标签 java multithreading

我正在编写一个多线程应用程序,在我的 ServerThread.run() 中方法,我用ServerSocket.accept()接收新的传入连接。每当有新连接到达时,ServerThread创建另一个名为 ClientHandler 的线程处理连接(接收/发送数据),并在我的 ServerThread 中,我有一个java.util.HashMap<ClientHandler, Socket>存储连接的客户端和相应套接字的引用。

在我的ServerThread ,我实现了其他一些公共(public)方法,例如 shutdown()停止服务器线程,disconnect(int id)关闭特定客户端的连接等。这些方法通常由我的 GUI 从 EDT 线程调用。

我已经测试了代码,它可以工作,但我不确定这是否是执行此操作的最佳方法。我读过很多Java多线程教程,但他们没有在自定义java.lang.Thread中添加其他公共(public)方法子类。

特别是在我的 ServerThread.run() 中,我用过ServerSocket.accept()的方法这应该是阻塞。当我想关闭我的ServerThread时,我得打电话ServerSocket.close()强制线程停止。

但是,当我调用例如 ServerThread.disconnect(int id) 时关闭远程客户端的连接,它可以工作。是ServerThread应该阻止accept()方法?

所以,我的代码可以工作,但我不知道为什么,我想知道是否可以在 java.lang.Thread 的自定义子类中添加其他公共(public)方法??

谢谢。

最佳答案

你不向 Thread 类添加公共(public)方法的原因正是因为出现了这种困惑 - 有一种直觉认为 Thread 类本身“拥有”这些方法的执行,而在 Java 中它总是 -拥有执行的调用线程。

当 EDT 线程调用 ServerThread.disconnect(id) 时,disconnect 方法中的代码由 EDT 线程运行,而不是 ServerThread。这里的关键点是,Thread ServerThread 和 Object ServerThread 从语义上讲并不完全相同 - 一个对象不能在同一个线程中被“阻塞”。与线程的方式不同,该表达式甚至没有意义。

关于java - Java如何处理线程中的公共(public)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20587288/

相关文章:

python - 无法关闭Python应用程序

multithreading - 内核线程 native 线程os线程

java - 如何在按下按钮之前激活按钮?

java - 在java中使用递归的带有L系统的龙曲线

c - 向 C 中的 pthreads 发送和捕获信号

c - 创建将同时为 200 多个客户端发送/接收任务的服务器时,使用选择或多线程(或两者)更好吗

c++ - 如果 ANSI C++ 不支持多线程,非托管 C++ 应用程序如何实现多线程?

java - 将 jsonnode 转换为 pojo

java - Tomcat 不拾取类文件 - 不显示 JSP 文件

java - 如何使用 Java 解析来自第三方服务器的 SOAP 响应