diff --git a/okhttp/src/main/java/com/squareup/okhttp/ConnectionPool.java b/okhttp/src/main/java/com/squareup/okhttp/ConnectionPool.java index 933bd7379..009f025e5 100644 --- a/okhttp/src/main/java/com/squareup/okhttp/ConnectionPool.java +++ b/okhttp/src/main/java/com/squareup/okhttp/ConnectionPool.java @@ -80,8 +80,9 @@ public class ConnectionPool { private final LinkedList connections = new LinkedList(); /** We use a single background thread to cleanup expired connections. */ - private final ExecutorService executorService = - new ThreadPoolExecutor(0, 1, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue()); + private final ExecutorService executorService = new ThreadPoolExecutor(0, 1, + 60L, TimeUnit.SECONDS, new LinkedBlockingQueue(), + Util.daemonThreadFactory("OkHttp ConnectionPool")); private final Callable connectionsCleanupCallable = new Callable() { @Override public Void call() throws Exception { List expiredConnections = new ArrayList(MAX_CONNECTIONS_TO_CLEANUP); diff --git a/okhttp/src/main/java/com/squareup/okhttp/internal/NamedRunnable.java b/okhttp/src/main/java/com/squareup/okhttp/internal/NamedRunnable.java index ce430b27b..992b2ae41 100644 --- a/okhttp/src/main/java/com/squareup/okhttp/internal/NamedRunnable.java +++ b/okhttp/src/main/java/com/squareup/okhttp/internal/NamedRunnable.java @@ -20,10 +20,10 @@ package com.squareup.okhttp.internal; * Runnable implementation which always sets its thread name. */ public abstract class NamedRunnable implements Runnable { - private String name; + private final String name; - public NamedRunnable(String name) { - this.name = name; + public NamedRunnable(String format, Object... args) { + this.name = String.format(format, args); } @Override public final void run() { diff --git a/okhttp/src/main/java/com/squareup/okhttp/internal/Util.java b/okhttp/src/main/java/com/squareup/okhttp/internal/Util.java index e19ef2178..0ce7f8aba 100644 --- a/okhttp/src/main/java/com/squareup/okhttp/internal/Util.java +++ b/okhttp/src/main/java/com/squareup/okhttp/internal/Util.java @@ -32,6 +32,7 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicReference; /** Junk drawer of utility methods. */ @@ -332,4 +333,14 @@ public final class Util { public static List immutableList(List list) { return Collections.unmodifiableList(new ArrayList(list)); } + + public static ThreadFactory daemonThreadFactory(final String name) { + return new ThreadFactory() { + @Override public Thread newThread(Runnable runnable) { + Thread result = new Thread(runnable, name); + result.setDaemon(true); + return result; + } + }; + } } diff --git a/okhttp/src/main/java/com/squareup/okhttp/internal/spdy/SpdyConnection.java b/okhttp/src/main/java/com/squareup/okhttp/internal/spdy/SpdyConnection.java index fccd14f89..299da8e0b 100644 --- a/okhttp/src/main/java/com/squareup/okhttp/internal/spdy/SpdyConnection.java +++ b/okhttp/src/main/java/com/squareup/okhttp/internal/spdy/SpdyConnection.java @@ -32,8 +32,6 @@ import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import static java.util.concurrent.Executors.defaultThreadFactory; - /** * A socket connection to a remote peer. A connection hosts streams which can * send and receive data. @@ -77,9 +75,9 @@ public final class SpdyConnection implements Closeable { static final int GOAWAY_PROTOCOL_ERROR = 1; static final int GOAWAY_INTERNAL_ERROR = 2; - private static final ExecutorService executor = - new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS, - new SynchronousQueue(), defaultThreadFactory()); + private static final ExecutorService executor = new ThreadPoolExecutor(0, + Integer.MAX_VALUE, 60, TimeUnit.SECONDS, new SynchronousQueue(), + Util.daemonThreadFactory("OkHttp SpdyConnection")); /** True if this peer initiated the connection. */ final boolean client; @@ -202,15 +200,14 @@ public final class SpdyConnection implements Closeable { } void writeSynResetLater(final int streamId, final int statusCode) { - executor.submit( - new NamedRunnable(String.format("Spdy Writer %s stream %d", hostName, streamId)) { - @Override public void execute() { - try { - writeSynReset(streamId, statusCode); - } catch (IOException ignored) { - } - } - }); + executor.submit(new NamedRunnable("OkHttp SPDY Writer %s stream %d", hostName, streamId) { + @Override public void execute() { + try { + writeSynReset(streamId, statusCode); + } catch (IOException ignored) { + } + } + }); } void writeSynReset(int streamId, int statusCode) throws IOException { @@ -218,15 +215,14 @@ public final class SpdyConnection implements Closeable { } void writeWindowUpdateLater(final int streamId, final int deltaWindowSize) { - executor.submit( - new NamedRunnable(String.format("Spdy Writer %s stream %d", hostName, streamId)) { - @Override public void execute() { - try { - writeWindowUpdate(streamId, deltaWindowSize); - } catch (IOException ignored) { - } - } - }); + executor.submit(new NamedRunnable("OkHttp SPDY Writer %s stream %d", hostName, streamId) { + @Override public void execute() { + try { + writeWindowUpdate(streamId, deltaWindowSize); + } catch (IOException ignored) { + } + } + }); } void writeWindowUpdate(int streamId, int deltaWindowSize) throws IOException { @@ -254,7 +250,7 @@ public final class SpdyConnection implements Closeable { } private void writePingLater(final int streamId, final Ping ping) { - executor.submit(new NamedRunnable(String.format("Spdy Writer %s ping %d", hostName, streamId)) { + executor.submit(new NamedRunnable("OkHttp SPDY Writer %s ping %d", hostName, streamId) { @Override public void execute() { try { writePing(streamId, ping); @@ -471,8 +467,7 @@ public final class SpdyConnection implements Closeable { return; } - executor.submit( - new NamedRunnable(String.format("Callback %s stream %d", hostName, streamId)) { + executor.submit(new NamedRunnable("OkHttp SPDY Callback %s stream %d", hostName, streamId) { @Override public void execute() { try { handler.receive(synStream);