user3681585
user3681585

Reputation: 43

Program freezes on bufferedreader close

Program freezes when closing buffered reader. Using forge modding API for minecraft, however I've had this issue before with standalone server side code. This particular code worked fine and then randomly started giving me this issue, not sure how to go about fixing this..

The close method:

public static void closeConnection() {
    if (keepConnection) {
        keepConnection = false;

        try {

            bufferedReader.close();
            printWriter.close();
            socket.close();
        }
        catch (IOException e) {

            e.printStackTrace();
        }

        finally{

            token = null;
        }
    }

}

I have checked to ensure that this is indeed where the freeze is occurring. Any ideas?

Upvotes: 2

Views: 1563

Answers (2)

Paul Jowett
Paul Jowett

Reputation: 6581

BufferedReader can block on close() because it contains a synchronized block on the lock instance:

synchronized (lock) {
    if (in == null)
      return;
    in.close();
    in = null;
    cb = null;
}

This means there is another Thread in your program working with the BufferedReader (possibly blocked in a read()) which is holding the lock when you try to close. The solution is to have this other thread release the lock (interrupted if necessary) to allow the close to get the lock then complete.

Upvotes: 6

user207421
user207421

Reputation: 310909

Not possible. BufferedReader.close() doesn't do anything that blocks. You don't even need it. PrintWriter.close() will close everything. Remove it.

The only operation that can freeze here is closing the PrintWriter, which implies flushing its buffer, and the reason for that must be that the peer is a long way behind reading the output of this program, or isn't reading it at all.

Upvotes: 0

Related Questions