| 68 | 1 package fschmidt.util.executor; | 
|  | 2 | 
|  | 3 import java.util.Queue; | 
|  | 4 import java.util.LinkedList; | 
|  | 5 import java.util.concurrent.Executor; | 
|  | 6 import java.util.concurrent.TimeUnit; | 
|  | 7 import java.util.concurrent.atomic.AtomicInteger; | 
|  | 8 import org.slf4j.Logger; | 
|  | 9 import org.slf4j.LoggerFactory; | 
|  | 10 | 
|  | 11 | 
|  | 12 public final class ThreadPool extends AbstractThreadPool implements Executor { | 
|  | 13 	private static final Logger logger = LoggerFactory.getLogger(ThreadPool.class); | 
|  | 14 | 
|  | 15 	private final Queue<Runnable> queue = new LinkedList<Runnable>(); | 
|  | 16 | 
|  | 17 	public ThreadPool(int size) { | 
|  | 18 		super(size); | 
|  | 19 		start(); | 
|  | 20 	} | 
|  | 21 | 
|  | 22 	@Override public final void execute(Runnable command) { | 
|  | 23 		dispatch(command); | 
|  | 24 	} | 
|  | 25 | 
|  | 26 	public final synchronized boolean dispatch(Runnable command) { | 
|  | 27 		if( !isRunning() ) | 
|  | 28 			return false; | 
|  | 29 		queue.add(wrap(command)); | 
|  | 30 		notify(); | 
|  | 31 		return true; | 
|  | 32 	} | 
|  | 33 | 
|  | 34 	@Override synchronized Runnable getCommand() { | 
|  | 35 		Runnable command; | 
|  | 36 		while( (command = queue.poll()) == null ) { | 
|  | 37 			if( !isRunning() ) | 
|  | 38 				return null; | 
|  | 39 			try { | 
|  | 40 				wait(); | 
|  | 41 			} catch(InterruptedException e) { | 
|  | 42 				logger.error("",e); | 
|  | 43 			} | 
|  | 44 		} | 
|  | 45 		return command; | 
|  | 46 	} | 
|  | 47 | 
|  | 48 	@Override public final synchronized int getQueueSize() { | 
|  | 49 		return queue.size(); | 
|  | 50 	} | 
|  | 51 | 
|  | 52 } |