スレッドプールのフレームワーク

1473 ワード

最近ネット上で1篇の良い文を見て、中にスレッドプールのフレームワークについてあって、感じはとても悪くなくて、先にコードを貼り付けます:

import java.util.LinkedList;

public class WorkQueue {
	
	private final int nThreads;
	private final PoolWorker[] threads;
	private final LinkedList queue;

	public WorkQueue(int nThreads) {
		this.nThreads = nThreads;
		queue = new LinkedList();
		threads = new PoolWorker[nThreads];

		for (int i = 0; i < nThreads; i++) {
			threads[i] = new PoolWorker();
			threads[i].start();
		}
	}

	public void execute(Runnable r) {
		synchronized (queue) {
			queue.addLast(r);
			queue.notify();
		}
	}

	private class PoolWorker extends Thread {
		
		public void run() {
			Runnable r;
			while (true) {
				synchronized (queue) {
					while (queue.isEmpty()) {
						try {
							queue.wait();
						} catch (InterruptedException ignored) {
						}
					}

					r = (Runnable) queue.removeFirst();
				}

				// If we don't catch RuntimeException,
				// the pool could leak threads
				try {
					r.run();
				} catch (RuntimeException e) {
					// You might want to log something here
				}
			}
		}
	}
}

固定サイズのスレッドプールを割り当てると、スレッドがスリープ状態に出ていない場合、タスクが到来すると、いずれかのスレッドが動作し、コードは長くありませんが、はっきりしています.