Skip to content

Commit 7970abd

Browse files
committed
Fix for TooTallNate#217 by ddrscott
WebSocketClient and writeThread cannot be garbage collected
1 parent bd2060f commit 7970abd

1 file changed

Lines changed: 14 additions & 8 deletions

File tree

‎src/main/java/org/java_websocket/client/WebSocketClient.java‎

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.IOException;
44
import java.io.InputStream;
55
import java.io.OutputStream;
6+
import java.lang.ref.WeakReference;
67
import java.net.InetSocketAddress;
78
import java.net.Proxy;
89
import java.net.Socket;
@@ -46,7 +47,8 @@ public abstract class WebSocketClient extends WebSocketAdapter implements Runnab
4647

4748
private Proxy proxy = Proxy.NO_PROXY;
4849

49-
private Thread writeThread;
50+
private WeakReference<Thread> readThread;
51+
private WeakReference<Thread> writeThread;
5052

5153
private Draft draft;
5254

@@ -155,10 +157,11 @@ public void setTcpNoDelay( boolean tcpNoDelay ) {
155157
* Initiates the websocket connection. This method does not block.
156158
*/
157159
public void connect() {
158-
if( writeThread != null )
160+
if( readThread != null )
159161
throw new IllegalStateException( "WebSocketClient objects are not reuseable" );
160-
writeThread = new Thread( this );
161-
writeThread.start();
162+
Thread reader = new Thread( this ,"WebsocketReadThread");
163+
reader.start();
164+
readThread = new WeakReference<Thread>( reader );
162165
}
163166

164167
/**
@@ -230,8 +233,9 @@ public void run() {
230233
return;
231234
}
232235

233-
writeThread = new Thread( new WebsocketWriteThread() );
234-
writeThread.start();
236+
Thread write = new Thread( new WebsocketWriteThread() );
237+
write.start();
238+
writeThread = new WeakReference<Thread>( write );
235239

236240
byte[] rawbuffer = new byte[ WebSocketImpl.RCVBUF ];
237241
int readBytes;
@@ -328,8 +332,10 @@ public final void onWebsocketOpen( WebSocket conn, Handshakedata handshake ) {
328332
*/
329333
@Override
330334
public final void onWebsocketClose( WebSocket conn, int code, String reason, boolean remote ) {
331-
if( writeThread != null )
332-
writeThread.interrupt();
335+
if( writeThread != null && writeThread.get() != null)
336+
writeThread.get().interrupt();
337+
if( readThread != null && readThread.get() != null)
338+
readThread.get().interrupt();
333339
try {
334340
if( socket != null )
335341
socket.close();

0 commit comments

Comments
 (0)