@Test public void shouldHaveConfigurableJettyThreadPoolSize() throws Exception { Jetty9WebServer server = new Jetty9WebServer( NullLogProvider.getInstance(), Config.defaults(), NetworkConnectionTracker.NO_OP ); int numCores = 1; int configuredMaxThreads = 12; // 12 is the new min max Threads value, for one core int acceptorThreads = 1; // In this configuration, 1 thread will become an acceptor... int selectorThreads = 1; // ... and 1 thread will become a selector... int jobThreads = configuredMaxThreads - acceptorThreads - selectorThreads; // ... and the rest are job threads server.setMaxThreads( numCores ); server.setHttpAddress( new ListenSocketAddress( "localhost", 0 ) ); try { server.start(); QueuedThreadPool threadPool = (QueuedThreadPool) server.getJetty().getThreadPool(); threadPool.start(); CountDownLatch startLatch = new CountDownLatch( jobThreads ); CountDownLatch endLatch = loadThreadPool( threadPool, configuredMaxThreads + 1, startLatch ); startLatch.await(); // Wait for threadPool to create threads int threads = threadPool.getThreads(); assertEquals( "Wrong number of threads in pool", configuredMaxThreads, threads ); endLatch.countDown(); } finally { server.stop(); } }
@Override public String toString() { return String.format("%s[%s]@%x{%s,%d<=%d<=%d,i=%d,q=%d}[%s]", getClass().getSimpleName(), _name, hashCode(), getState(), getMinThreads(), getThreads(), getMaxThreads(), getIdleThreads(), _jobs.size(), _tryExecutor); }
/** * @return the number of busy threads in the pool */ @ManagedAttribute("number of busy threads in the pool") public int getBusyThreads() { int reserved = _tryExecutor instanceof ReservedThreadExecutor ? ((ReservedThreadExecutor)_tryExecutor).getAvailable() : 0; return getThreads() - getIdleThreads() - reserved; }
@Override public void execute(Runnable job) { if (LOG.isDebugEnabled()) LOG.debug("queue {}",job); if (!isRunning() || !_jobs.offer(job)) { LOG.warn("{} rejected {}", this, job); throw new RejectedExecutionException(job.toString()); } else { // Make sure there is at least one thread executing the job. if (getThreads() == 0) startThreads(1); } }
/** * <p>Returns whether this thread pool is low on threads.</p> * <p>The current formula is:</p> * <pre> * maxThreads - threads + idleThreads - queueSize <= lowThreadsThreshold * </pre> * * @return whether the pool is low on threads * @see #getLowThreadsThreshold() */ @Override @ManagedAttribute(value = "thread pool is low on threads", readonly = true) public boolean isLowOnThreads() { return getMaxThreads() - getThreads() + getIdleThreads() - getQueueSize() <= getLowThreadsThreshold(); }
@Override public int getThreads() { return threadPool.getThreads(); } }
public int getThreads() { return threadPool.getThreads(); }
@Override public Long getInstantValue() { return Long.valueOf(this.httpThreadPool.getThreads()); } }
@Managed(description = "number of threads in the pool") public int getThreads() { return threadPool.getThreads(); }
/** * @return The number of busy threads in the pool */ @ManagedAttribute("total number of busy threads in the pool") public int getBusyThreads() { return getThreads() - getIdleThreads(); }
@Override public void execute(Runnable job) { if (!isRunning() || !_jobs.offer(job)) { LOG.warn("{} rejected {}", this, job); throw new RejectedExecutionException(job.toString()); } else { // Make sure there is at least one thread executing the job. if (getThreads() == 0) startThreads(1); } }
@Override public String toString() { return _name+"{"+getMinThreads()+"<="+getIdleThreads()+"<="+getThreads()+"/"+getMaxThreads()+","+(_jobs==null?-1:_jobs.size())+"}"; }
@Override public String toString() { return _name+"{"+getMinThreads()+"<="+getIdleThreads()+"<="+getThreads()+"/"+getMaxThreads()+","+(_jobs==null?-1:_jobs.size())+"}"; }
@Override public String toString() { return _name+"{"+getMinThreads()+"<="+getIdleThreads()+"<="+getThreads()+"/"+getMaxThreads()+","+(_jobs==null?-1:_jobs.size())+"}"; }
@Override public String toString() { return _name+"{"+getMinThreads()+"<="+getIdleThreads()+"<="+getThreads()+"/"+getMaxThreads()+","+(_jobs==null?-1:_jobs.size())+"}"; }
@Override public String toString() { return String.format("%s{%s,%d<=%d<=%d,i=%d,q=%d}", _name, getState(), getMinThreads(), getThreads(), getMaxThreads(), getIdleThreads(), (_jobs == null ? -1 : _jobs.size())); }
@Override public String toString() { return String.format("%s{%s,%d<=%d<=%d,i=%d,q=%d}", _name, getState(), getMinThreads(), getThreads(), getMaxThreads(), getIdleThreads(), (_jobs == null ? -1 : _jobs.size())); }
@Override public String toString() { return String.format("%s{%s,%d<=%d<=%d,i=%d,q=%d}", _name, getState(), getMinThreads(), getThreads(), getMaxThreads(), getIdleThreads(), (_jobs == null ? -1 : _jobs.size())); }
/** * @return the number of busy threads in the pool */ @ManagedAttribute("number of busy threads in the pool") public int getBusyThreads() { int reserved = _tryExecutor instanceof ReservedThreadExecutor ? ((ReservedThreadExecutor)_tryExecutor).getAvailable() : 0; return getThreads() - getIdleThreads() - reserved; }
@Gauge public int getFreeThreadCount() { return (executor.getMaxThreads() - executor.getThreads()) + executor.getIdleThreads() ; }