资源卡住的Java尝试

资源卡住的Java尝试,java,sockets,try-with-resources,Java,Sockets,Try With Resources,我有一个经典的服务器多客户端程序。t服务器侦听ServerSocket,并为每个传入的套接字构建一个新的可运行类,并在ExecuteService中执行 在Runnable类的run方法中,我打开try with resources块,在try中我有一个while循环,它从inputstream读取并写入outputstream,直到它从客户端接收到FIN命令。一切正常,客户端成功断开连接。运行到达finally块并打印一些用于测试的内容,但是它没有退出try块,因此它没有退出run方法,我被困

我有一个经典的服务器多客户端程序。t服务器侦听ServerSocket,并为每个传入的套接字构建一个新的可运行类,并在ExecuteService中执行

在Runnable类的run方法中,我打开try with resources块,在try中我有一个while循环,它从inputstream读取并写入outputstream,直到它从客户端接收到FIN命令。一切正常,客户端成功断开连接。运行到达finally块并打印一些用于测试的内容,但是它没有退出try块,因此它没有退出run方法,我被困在运行的某个地方,可能是inputstream的read方法

如果有人感兴趣,我可以发布代码

如何强制关闭finally中的所有内容并退出run方法

代码:
Server.java:

public static void main(String[] args) {
    playersReady = new ArrayList<Integer>();
    ServerSocket server = null;
    try {
        server = new ServerSocket(Consts.PORT);
        ExecutorService service = Executors.newFixedThreadPool(characters.size());
        while(playersReady.size()<characters.size()){
            RequestHandler handler = new RequestHandler(server.accept());
            service.execute(handler);
        }
        service.shutdownNow();
        service.shutdown();
        while(!service.isTerminated()){}

        System.out.println("finished");


finally中的
System.out.println(“已完成”)
已打印, 但是run方法末尾的
System.out.println(“Done run”)
没有

为什么?

它卡在run方法中,我想是在readUTF调用中,但我关闭了所有资源

您在该行之前返回,这就是它不运行的原因。finally块仍然运行,因为它是finally块。最后总是运行块,此规则只有一个例外:
System.exit()
,但情况并非如此

您在该行之前返回,这就是它不运行的原因。finally块仍然运行,因为它是finally块。最后总是运行块,此规则只有一个例外:
System.exit()
,但情况并非如此

你试过调试你的程序吗?你的“我认为在readUTF调用中”有点含糊不清。我试过了,没什么特别的,它传递run方法并进入java的Runnable类,然后停止,但是线程继续运行。你试过调试你的程序吗?你的“我认为在readUTF调用中”有点含糊不清。我试过了,没有什么特别的,它通过run方法进入java的Runnable类并停止,但是线程继续运行哪一行?run方法运行得很好,只是没有停止,也没有停止关联的thread哦,我明白了,我把每个“return”语句都改为“break”。它现在打印最后的print命令,但是线程没有停止,我的意思是它不会继续服务器的run method哪一行?run方法运行得很好,只是没有停止,也没有停止关联的thread哦,我明白了,我把每个“return”语句都改为“break”。它现在打印最后的print命令,但是线程没有停止,我的意思是它不会继续服务器的run方法
public final class RequestHandler implements Runnable {

    .....

public void run() {
    //DataOutputStream output = null;
    //DataInputStream input = null;

    try (DataOutputStream output = new DataOutputStream(socket.getOutputStream());
            DataInputStream input = new DataInputStream(socket.getInputStream())){
        // socket.setSoTimeout(500);
        handleReady(input.readUTF().split(" "), output);
        while (/*!shutdown && !socket.isClosed() && */socket.isConnected()) {

            System.out.println("check before read " + character.getId());
            String request = input.readUTF();
            System.out.println("check after read " + character.getId());

            System.out.println("-----------------------------------" + request);
            if (shutdown) {
                socket.shutdownInput();
                socket.getOutputStream().flush();
                socket.shutdownOutput();
                break;
            }
            String[] requestParser = request.split(" ");
            if (requestParser[1].equals("DMG")) {
                // handle damage request
                handleDamage(requestParser, output);
            } else if (requestParser[1].equals("BND")) {
                // handle bandage request
                handleBandage(requestParser, output);
            } else if (requestParser[1].equals("FIN")) {
                // handle finish request
                handleFin();
                if (!socket.isClosed())
                    socket.shutdownInput();
                if (!socket.isClosed()) {
                    socket.getOutputStream().flush();
                    socket.shutdownOutput();
                }
                shutdown = true;
                break;
            } else {
                break;
            }
        }
    } catch (SocketTimeoutException e) {
        System.out.println(e.getMessage());
    } catch (IOException e) {
        e.printStackTrace();
        shutdown = true;
        break;
    } catch (Throwable e) {
        e.printStackTrace();
    } finally {
        try {
            System.out.println("finished");

            if (!socket.isClosed())
                socket.shutdownInput();
            if (!socket.isClosed()) {
                socket.getOutputStream().flush();
                socket.shutdownOutput();
                socket.close();
            }
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    System.out.println("Done run");
}