2013-12-14 49 views
2

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

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

我测试过的代码,它的工作原理,但我不知道,如果是做到这一点的最好办法。我已经阅读了很多Java多线程教程,但是他们在自定义java.lang.Thread子类中不添加其他公共方法。

特别是在我的ServerThread.run()中,我使用的方法ServerSocket.accept()应该是阻止。当我要关机我ServerThread,我要叫ServerSocket.close()强迫线程停止。

然而,当我打电话例如ServerThread.disconnect(int id)关闭远程客户端的连接,它的工作原理。 ServerThread应该在accept()方法上阻塞?

所以,我的代码工作,但我不知道为什么,我想知道如果一个人能在java.lang.Thread自定义子类中添加其他公共方法?

谢谢。

回答

3

你不向Thread类中添加公有方法的原因正是因为这种混淆的产生 - 有一种直觉认为Thread类本身拥有这些方法的执行,而在Java中它总是 - 拥有执行权的调用线程。

当EDT线程调用ServerThread.disconnect(id)时,disconnect方法中的代码由EDT线程运行,而不是由ServerThread运行。这里的关键是线程 ServerThread和对象 ServerThread并不完全相同,在语义上来说 - 一个对象不能像线程一样被“阻塞”,表达式不会“这甚至是有道理的。

+0

感谢您的答复@torquestomp,所以在我的情况,我需要建立一个新的类'Server'保持连接的客户端和引用的处理线程,还含有其它公共与方法,我可以关闭连接的特定客户。新的'ServerThread'没有别的,只是等待新的传入连接,并将处理线程的引用存储在'Server'对象中。 EDT使用'Server'对象的公共方法来处理处理线程,可以通过一个单例Server.getInstance()来检索它。这样更好吗? – vesontio

+0

所以不建议把公共方法在一个线程,但它并不被禁止,因为我还需要方法'公共无效停止()'果然旗'running'到'FALSE'并停止'ServerThread'。 – vesontio

+1

@vesontio根本不推荐扩展Thread。几乎从来没有一个好的理由去做,你的情况当然不需要它。 –