/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.api.util;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
public class ThreadUtil {
private ThreadUtil() {
super();
}
/**
* Creates an Executor that uses a single worker thread operating off an unbounded queue, and uses the provided
* ThreadFactory to create a new thread when needed. Unlike the otherwise equivalent
* {@code newFixedThreadPool(1, threadFactory)} the returned executor is guaranteed not to be reconfigurable to use
* additional threads.
*
* @param name
* the name of the new thread
*
* @return the newly created single-threaded Executor
* @throws NullPointerException
* if threadFactory is null
*/
public static final ExecutorService buildNewSingleThreadExecutor(final String name) {
return Executors.newSingleThreadExecutor(getThreadFactory(name));
}
/**
* Creates a thread pool that reuses a fixed number of threads operating off a shared unbounded queue, using the
* provided ThreadFactory to create new threads when needed. At any point, at most {@code nThreads} threads will be
* active processing tasks. If additional tasks are submitted when all threads are active, they will wait in the
* queue until a thread is available. If any thread terminates due to a failure during execution prior to shutdown,
* a new one will take its place if needed to execute subsequent tasks. The threads in the pool will exist until it
* is explicitly {@link ExecutorService#shutdown shutdown}.
*
* @param nThreads
* the number of threads in the pool
* @param name
* the name of the new thread
* @return the newly created thread pool
* @throws NullPointerException
* if threadFactory is null
* @throws IllegalArgumentException
* if {@code nThreads <= 0}
*/
public static final ExecutorService buildNewFixedThreadExecutor(int nThreads, final String name) {
return Executors.newFixedThreadPool(nThreads, getThreadFactory(name));
}
/**
* Based on the default thread factory
*
* @param name
* the name prefix of the new thread
* @return the factory to use when creating new threads
*/
public static final ThreadFactory getThreadFactory(String name) {
return r -> {
Thread t = Executors.defaultThreadFactory().newThread(r);
t.setName(name + "-" + t.getName()); //$NON-NLS-1$
return t;
};
}
}