diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java index d8441cbe701eed94a0da02bdb320dee88c9fa14a..1431b110fa591a4963880998a6f6c7d4075f9144 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPSendFinisher.java @@ -6,6 +6,7 @@ import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; import net.i2p.I2PAppContext; import net.i2p.router.OutNetMessage; @@ -30,7 +31,7 @@ class NTCPSendFinisher { private final I2PAppContext _context; private final NTCPTransport _transport; private final Log _log; - private static int _count; + private static final AtomicInteger _count = new AtomicInteger(); private ThreadPoolExecutor _executor; private static final int THREADS; static { @@ -46,7 +47,6 @@ class NTCPSendFinisher { } public synchronized void start() { - _count = 0; _executor = new CustomThreadPoolExecutor(THREADS); } @@ -68,7 +68,7 @@ class NTCPSendFinisher { private static class CustomThreadPoolExecutor extends ThreadPoolExecutor { public CustomThreadPoolExecutor(int num) { // use unbounded queue, so maximumPoolSize and keepAliveTime have no effect - super(num, num, 1000, TimeUnit.MILLISECONDS, + super(MIN_THREADS, num, 10*1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), new CustomThreadFactory()); } } @@ -76,7 +76,7 @@ class NTCPSendFinisher { private static class CustomThreadFactory implements ThreadFactory { public Thread newThread(Runnable r) { Thread rv = Executors.defaultThreadFactory().newThread(r); - rv.setName("NTCPSendFinisher " + (++_count) + '/' + THREADS); + rv.setName("NTCPSendFinisher " + _count.incrementAndGet() + '/' + THREADS); rv.setDaemon(true); return rv; }