## org.biojava.utils
Class SimpleThreadPool

    java.lang.Object
      org.biojava.utils.SimpleThreadPool

All Implemented Interfaces:
  ThreadPool

    public class SimpleThreadPool

extends Object
implements ThreadPool

`SimpleThreadPool` is a basic implementation of `ThreadPool` for use where we don't wish to introduce a dependency on a 3rd-party pool. In general, objects which require a pool should only use the interface and parameterize such that other implementations may be dropped in in place of this one, possibly using this one as a fallback.

This class offers a service for running `Runnable`s using multiple threads, the number of which is specified in the constructor. `Runnable`s are queued in a simple FIFO queue. The worker threads wait on the queue when it is empty and are notified when a new `Runnable` is submitted.

This implementation will prevent an application from exiting until `stopThreads()` is called unless the pool contains daemon threads.

Since:
  1.3
Author:
  Keith James

Field Summary
`protected int` `priority`
`protected org.biojava.utils.SimpleThreadPool.PooledThread[]` `threads`

Constructor Summary
`SimpleThreadPool()` Creates a new `SimpleThreadPool` containing 4 non-daemon threads and starts them.
`SimpleThreadPool(int threadCount, boolean daemon)` Creates a new `SimpleThreadPool` containing the specified number of threads and starts them.
`SimpleThreadPool(int threadCount, boolean daemon, int priority)` Creates a new `SimpleThreadPool` containing the specified number of threads and starts them.

Method Summary
`void` `addRequest(Runnable task)` `addRequest` requests that a `Runnable` be scheduled to be run by one of the threads in the pool.
`protected Runnable` `nextRequest()` `nextRequest` gets the next `Runnable` from the queue.
`int` `requestsQueued()` `requestsQueued` returns the number of `Runnable`s currently queued.
`void` `startThreads()` `startThreads` starts all the threads running and opens the pool to requests.
`void` `stopThreads()` Waits for all working threads to return and then stops them.
`protected int` `threadsAlive()` `threadsAlive` returns the number of threads currently alive.
`int` `threadsIdle()` `threadsIdle` returns the number of threads currently waiting for work.
`int` `threadsWorking()` `threadsWorking` returns the number of threads currently performing work.
`void` `waitForThreads()` `waitForThreads` temporarily closes the pool to new requests until such time as the current request queue has been emptied and all running tasks completed.

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

Field Detail

### threads

    protected org.biojava.utils.SimpleThreadPool.PooledThread[] threads

### priority

    protected int priority

Constructor Detail

### SimpleThreadPool

    public SimpleThreadPool()

  Creates a new `SimpleThreadPool` containing 4 non-daemon threads and starts them. The threads have priority Thread.NORM_PRIORITY. Because threads are non-deamon you will need to call stopThreads() to terminate them.

### SimpleThreadPool

    public SimpleThreadPool(int threadCount,
                            boolean daemon)

  Creates a new `SimpleThreadPool` containing the specified number of threads and starts them. The threads have priority Thread.NORM_PRIORITY.

  Parameters:
    `threadCount` - an `int` thread count.
    `daemon` - a `boolean` indicating whether the threads should be daemons. If threads are non-deamon you will need to call stopThreads() to terminate them.

### SimpleThreadPool

    public SimpleThreadPool(int threadCount,
                            boolean daemon,
                            int priority)

  Creates a new `SimpleThreadPool` containing the specified number of threads and starts them.

  Parameters:
    `threadCount` - an `int` thread count.
    `daemon` - a `boolean` indicating whether the threads should be daemons. If threads are non-deamon you will need to call stopThreads() to terminate them.
    `priority` - an `int` priority for the threads.

Method Detail

### addRequest

    public void addRequest(Runnable task)

  Description copied from interface: `ThreadPool`
  `addRequest` requests that a `Runnable` be scheduled to be run by one of the threads in the pool.

  Specified by:
    `addRequest` in interface `ThreadPool`
  Parameters:
    `task` - a `Runnable`.

### startThreads

    public void startThreads()

  Description copied from interface: `ThreadPool`
  `startThreads` starts all the threads running and opens the pool to requests.

  Specified by:
    `startThreads` in interface `ThreadPool`

### stopThreads

    public void stopThreads()

  Waits for all working threads to return and then stops them. If the thread pool contains non-daemon threads you will have to call this method to make your program return.

  Specified by:
    `stopThreads` in interface `ThreadPool`
  Throws:
    `IllegalStateException` - if the pool is already stopped.

### waitForThreads

    public void waitForThreads()

  Description copied from interface: `ThreadPool`
  `waitForThreads` temporarily closes the pool to new requests until such time as the current request queue has been emptied and all running tasks completed.

  Specified by:
    `waitForThreads` in interface `ThreadPool`

### threadsWorking

    public int threadsWorking()

  `threadsWorking` returns the number of threads currently performing work.

  Returns:
    an `int`.

### threadsIdle

    public int threadsIdle()

  `threadsIdle` returns the number of threads currently waiting for work.

  Returns:
    an `int`.

### requestsQueued

    public int requestsQueued()

  `requestsQueued` returns the number of `Runnable`s currently queued.

  Returns:
    an `int`.

### threadsAlive

    protected int threadsAlive()

  `threadsAlive` returns the number of threads currently alive.

  Returns:
    an `int`.

### nextRequest

    protected Runnable nextRequest()

  `nextRequest` gets the next `Runnable` from the queue. This method blocks if the queue is empty and the pool has not stopped. If the pool has stopped it returns null.

  Returns:
    a `Runnable` or null if the pool has been stopped.