Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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编写一个多线程服务器应用程序。 一切正常,但有一个小问题。 当我停止侦听传入连接请求的runnable时,套接字保持存在。所以我的问题是:我如何停止一个可运行对象并清理在这个可运行对象中生成的所有对象 停止线程的代码: Runnable tr = new Worldwide() ; Thread thread = new Thread(tr) ; thread.start() ; online = true ;

我正在用Java编写一个多线程服务器应用程序。 一切正常,但有一个小问题。 当我停止侦听传入连接请求的runnable时,套接字保持存在。所以我的问题是:我如何停止一个可运行对象并清理在这个可运行对象中生成的所有对象

停止线程的代码:

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
对象上调用该方法。这样,主线程就不需要看到套接字对象。