001    /*
002     * Copyright 2011-2015 UnboundID Corp.
003     * All Rights Reserved.
004     */
005    /*
006     * Copyright (C) 2011-2015 UnboundID Corp.
007     *
008     * This program is free software; you can redistribute it and/or modify
009     * it under the terms of the GNU General Public License (GPLv2 only)
010     * or the terms of the GNU Lesser General Public License (LGPLv2.1 only)
011     * as published by the Free Software Foundation.
012     *
013     * This program is distributed in the hope that it will be useful,
014     * but WITHOUT ANY WARRANTY; without even the implied warranty of
015     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
016     * GNU General Public License for more details.
017     *
018     * You should have received a copy of the GNU General Public License
019     * along with this program; if not, see <http://www.gnu.org/licenses>.
020     */
021    package com.unboundid.util;
022    
023    
024    
025    import java.util.concurrent.ThreadFactory;
026    import java.util.concurrent.atomic.AtomicLong;
027    
028    
029    
030    /**
031     * This class provides a thread factory implementation that may be used to
032     * create threads with a number of basic settings.  The name of each thread will
033     * be followed by a counter indicating the order in which the thread was
034     * created.
035     */
036    public final class LDAPSDKThreadFactory
037           implements ThreadFactory
038    {
039      // The counter that will be used for the thread number.
040      private final AtomicLong threadCounter;
041    
042      // Indicates whether the threads should be created as daemon threads.
043      private final boolean daemon;
044    
045      // The base name to use for newly-created threads.
046      private final String baseName;
047    
048      // The thread group that should be used for the threads.
049      private final ThreadGroup threadGroup;
050    
051    
052    
053      /**
054       * Creates a new instance of this thread factory with the provided settings.
055       * Threads created will have the default thread group.
056       *
057       * @param  baseName  The base name to use for threads created by this factory.
058       * @param  daemon    Indicates whether the threads should be created as daemon
059       *                   threads.
060       */
061      public LDAPSDKThreadFactory(final String baseName, final boolean daemon)
062      {
063        this(baseName, daemon, null);
064      }
065    
066    
067    
068      /**
069       * Creates a new instance of this thread factory with the provided settings.
070       *
071       * @param  baseName     The base name to use for threads created by this
072       *                      factory.  It must not be {@code null}.
073       * @param  daemon       Indicates whether the threads should be created as
074       *                      daemon threads.
075       * @param  threadGroup  The thread group to use for threads created by this
076       *                      factory.  It may be {@code null} if the default thread
077       *                      group should be used.
078       */
079      public LDAPSDKThreadFactory(final String baseName, final boolean daemon,
080                                  final ThreadGroup threadGroup)
081      {
082        this.baseName     = baseName;
083        this.daemon       = daemon;
084        this.threadGroup  = threadGroup;
085    
086        threadCounter = new AtomicLong(1L);
087      }
088    
089    
090    
091      /**
092       * Creates a new thread using the settings for this thread factory.  The new
093       * thread will not be started.
094       *
095       * @param  r  The {@code Runnable} target that will be used for the actual
096       *            thread logic.  It must not be {@code null}.
097       *
098       * @return  The newly-created (but not yet started) thread.
099       */
100      public Thread newThread(final Runnable r)
101      {
102        final String name = baseName + ' ' + threadCounter.getAndIncrement();
103        final Thread t = new Thread(threadGroup, r, baseName);
104        t.setDaemon(daemon);
105        return t;
106      }
107    }