Java:使用套接字清理可运行对象
我正在用Java编写一个多线程服务器应用程序。 一切正常,但有一个小问题。 当我停止侦听传入连接请求的runnable时,套接字保持存在。所以我的问题是:我如何停止一个可运行对象并清理在这个可运行对象中生成的所有对象 停止线程的代码:Java:使用套接字清理可运行对象,java,multithreading,sockets,Java,Multithreading,Sockets,我正在用Java编写一个多线程服务器应用程序。 一切正常,但有一个小问题。 当我停止侦听传入连接请求的runnable时,套接字保持存在。所以我的问题是:我如何停止一个可运行对象并清理在这个可运行对象中生成的所有对象 停止线程的代码: Runnable tr = new Worldwide() ; Thread thread = new Thread(tr) ; thread.start() ; online = true ;
Runnable tr = new Worldwide() ;
Thread thread = new Thread(tr) ;
thread.start() ;
online = true ;
while (core.getServerSate()) {
try{
Thread.sleep(200);
} catch (Exception e ) {
e.printStackTrace();
}
} ;
thread.stop() ;
thread.
core.printToConsole("Server is offline now") ;
可运行代码:
public class Worldwide implements Runnable {
Core core = Core.getInstance() ;
public Worldwide () {
}
@Override
public void run() {
try {
ServerSocket server = new ServerSocket(port) ;
core.printToConsole("Server is online") ;
core.printToConsole ( "listening on port :" + server.getLocalPort()) ;
while (core.getServerSate() == true) {
Socket client = server.accept() ;
Runnable tr = new ClientCommunication(client) ;
new Thread (tr).start() ;
}
}
catch(Exception e ) {
core.printToConsole ("An error occured while going online") ;
e.printStackTrace() ;
}
}
谢谢,Tom您需要通过调用套接字的-方法显式关闭ServerSocket。执行此操作的最佳位置是在
Worldwide
-类的run
-方法中,在finally
-块中(这样即使发生异常,套接字也会关闭)。您可以从主线程关闭套接字。这将中断对accept
的调用,并导致它抛出IOException
。然后,您可以从捕获的IOException
中退出accept线程的run
方法。停止。此方法已被弃用。相反,最好使用Thread.interrupt
,并根据线程的中断状态建立循环逻辑。当您捕获到中断时,您需要传播它。我想这对我来说不起作用,因为循环在Socket client=server.accept()处停止;谢谢你的回答。但是我如何才能从主线程关闭套接字?@tb96。您必须在主线程中创建套接字并将其传递给工作线程。这样,两个线程中都有套接字对象,可以在工作线程中调用accept
,在主线程中调用close
。谢谢,这就是我需要的答案:)@tb96:或者更好的解决方案是在实现Runnable
的类中放置一个方法stopServer
,然后在tr
对象上调用该方法。这样,主线程就不需要看到套接字对象。