All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opendaylight.yangtools.util.concurrent.SpecialExecutors Maven / Gradle / Ivy

There is a newer version: 14.0.4
Show newest version
/*
 * Copyright (c) 2014 Brocade Communications Systems, Inc. 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
 */

package org.opendaylight.yangtools.util.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * Factory methods for creating {@link ExecutorService} instances with specific configurations.
 *
 * @author Thomas Pantelis
 */
public final class SpecialExecutors {

    private SpecialExecutors() {
    }

    /**
     * Creates an ExecutorService with a specified bounded queue capacity that favors creating new
     * threads over queuing, as the former is faster, so threads will only be reused when the thread
     * limit is exceeded and tasks are queued. If the maximum queue capacity is reached, subsequent
     * tasks will be rejected.
     *
     * 

For example, if the maximum number of threads is 100 and 100 short-lived tasks are submitted * within say 10 seconds, then 100 threads will be created and used - previously constructed * idle threads will not be reused. This provides the fastest execution of the 100 tasks at the * expense of memory and thread resource overhead. Therefore it is advisable to specify a * relatively small thread limit (probably no more than 50). * *

Threads that have not been used for 15 seconds are terminated and removed from the pool. * Thus, a pool that remains idle for long enough will not consume any resources. * *

If you need an executor with less memory and thread resource overhead where slower execution * time is acceptable, consider using {@link #newBoundedCachedThreadPool }. * * @param maximumPoolSize * the maximum number of threads to allow in the pool. Threads will terminate after * being idle for 15 seconds. * @param maximumQueueSize * the capacity of the queue. * @param threadPrefix * the name prefix for threads created by this executor. * @param loggerIdentity * the class to use as logger name for logging uncaught exceptions from the threads. * @return a new ExecutorService with the specified configuration. */ public static ExecutorService newBoundedFastThreadPool(int maximumPoolSize, int maximumQueueSize, String threadPrefix, Class loggerIdentity) { return new FastThreadPoolExecutor(maximumPoolSize, maximumQueueSize, threadPrefix, loggerIdentity); } /** * Creates an ExecutorService similar to {@link #newBoundedFastThreadPool } except that it * handles rejected tasks by running them in the same thread as the caller. Therefore if the * queue is full, the caller submitting the task will be blocked until the task completes. In * this manner, tasks are never rejected. * * @param maximumPoolSize * the maximum number of threads to allow in the pool. Threads will terminate after * being idle for 15 seconds. * @param maximumQueueSize * the capacity of the queue. * @param threadPrefix * the name prefix for threads created by this executor. * @param loggerIdentity * the class to use as logger name for logging uncaught exceptions from the threads. * @return a new ExecutorService with the specified configuration. */ public static ExecutorService newBlockingBoundedFastThreadPool(int maximumPoolSize, int maximumQueueSize, String threadPrefix, Class loggerIdentity) { FastThreadPoolExecutor executor = new FastThreadPoolExecutor(maximumPoolSize, maximumQueueSize, threadPrefix, loggerIdentity); executor.setRejectedExecutionHandler(CountingRejectedExecutionHandler.newCallerRunsPolicy()); return executor; } /** * Creates an ExecutorService with a specified bounded queue capacity that favors reusing * previously constructed threads, when they are available, over creating new threads. When a * task is submitted, if no existing thread is available, a new thread will be created and added * to the pool. If there is an existing idle thread available, the task will be handed to that * thread to execute. If the specified maximum thread limit is reached, subsequent tasks will be * queued and will execute as threads become available. If the maximum queue capacity is * reached, subsequent tasks will be rejected. * *

Threads that have not been used for sixty seconds are terminated and removed from the pool. * Thus, a pool that remains idle for long enough will not consume any resources. * *

By reusing threads when possible, this executor optimizes for reduced memory and thread * resource overhead at the expense of execution time. * *

If you need an executor with faster execution time where increased memory and thread resource * overhead is acceptable, consider using {@link #newBoundedFastThreadPool }. * * @param maximumPoolSize * the maximum number of threads to allow in the pool. Threads will terminate after * being idle for 60 seconds. * @param maximumQueueSize * the capacity of the queue. * @param threadPrefix * the name prefix for threads created by this executor. * @return a new ExecutorService with the specified configuration. */ public static ExecutorService newBoundedCachedThreadPool(int maximumPoolSize, int maximumQueueSize, String threadPrefix, Class loggerIdentity) { return new CachedThreadPoolExecutor(maximumPoolSize, maximumQueueSize, threadPrefix, loggerIdentity); } /** * Creates an ExecutorService similar to {@link #newBoundedCachedThreadPool } except that it * handles rejected tasks by running them in the same thread as the caller. Therefore if the * queue is full, the caller submitting the task will be blocked until the task completes. In * this manner, tasks are never rejected. * * @param maximumPoolSize * the maximum number of threads to allow in the pool. Threads will terminate after * being idle for 60 seconds. * @param maximumQueueSize * the capacity of the queue. * @param threadPrefix * the name prefix for threads created by this executor. * @return a new ExecutorService with the specified configuration. */ public static ExecutorService newBlockingBoundedCachedThreadPool(int maximumPoolSize, int maximumQueueSize, String threadPrefix, Class loggerIdentity) { CachedThreadPoolExecutor executor = new CachedThreadPoolExecutor(maximumPoolSize, maximumQueueSize, threadPrefix, loggerIdentity); executor.setRejectedExecutionHandler(CountingRejectedExecutionHandler.newCallerRunsPolicy()); return executor; } /** * Creates an ExecutorService that uses a single worker thread operating off a bounded queue * with the specified capacity. Tasks are guaranteed to execute sequentially, and no more than * one task will be active at any given time. If the maximum queue capacity is reached, * subsequent tasks will be rejected. * * @param maximumQueueSize * the capacity of the queue. * @param threadPrefix * the name prefix for the thread created by this executor. * @param loggerIdentity * the class to use as logger name for logging uncaught exceptions from the threads. * @return a new ExecutorService with the specified configuration. */ public static ExecutorService newBoundedSingleThreadExecutor(int maximumQueueSize, String threadPrefix, Class loggerIdentity) { return new FastThreadPoolExecutor(1, maximumQueueSize, Long.MAX_VALUE, TimeUnit.SECONDS, threadPrefix, loggerIdentity); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy