我正在编写一个多线程应用程序,在我的 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/