/*
* Copyright (c) 2010, 2017 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0, which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* This Source Code may also be made available under the following Secondary
* Licenses when the conditions for such availability set forth in the
* Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
* version 2 with the GNU Classpath Exception, which is available at
* https://www.gnu.org/software/classpath/license.html.
*
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
*/
package org.glassfish.grizzly.threadpool;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedTransferQueue;
import java.util.concurrent.RejectedExecutionException;
Minimalistic fixed thread pool to allow for nice scalability if a
good Queue impl is used.
Author: gustav trede
/**
* Minimalistic fixed thread pool to allow for nice scalability if a
* good Queue impl is used.
*
* @author gustav trede
*/
public class FixedThreadPool extends AbstractThreadPool {
protected final BlockingQueue<Runnable> workQueue;
public FixedThreadPool(ThreadPoolConfig config) {
super(config);
this.workQueue = config.getQueue() != null ?
(BlockingQueue<Runnable>) config.getQueue() :
(BlockingQueue<Runnable>) config.setQueue(
new LinkedTransferQueue<>()).getQueue();
int poolSize = config.getMaxPoolSize();
synchronized (stateLock) {
while (poolSize-- > 0) {
doStartWorker();
}
}
ProbeNotifier.notifyThreadPoolStarted(this);
super.onMaxNumberOfThreadsReached();
}
Must hold statelock while calling this method.
/**
* Must hold statelock while calling this method.
*/
private void doStartWorker() {
startWorker(new BasicWorker());
}
@Override
public void execute(Runnable command) {
if (running) {
if (workQueue.offer(command)) {
// doublecheck the pool is still running
if (!running && workQueue.remove(command)) {
throw new RejectedExecutionException("ThreadPool is not running");
}
onTaskQueued(command);
return;
}
onTaskQueueOverflow();
return;
}
throw new RejectedExecutionException("ThreadPool is not running");
}
private final class BasicWorker extends Worker {
@Override
protected final Runnable getTask() throws InterruptedException {
return workQueue.take();
}
}
}