Thread Pool implementasyonu

thread, java May 26th, 2011

Diyelim ki çok fazla veri işliyorsunuz ve her bir işlem belli bir süre alıyor. Bu verileri tek tek işlemek sizi yavaşlatır. Eğer paralel işlemenizde sakınca olan bir durum yoksa işleri arkaplanda bir thread pool yardımıyla çok daha hızlı bir şekilde gerçekleştirebilirsiniz. Örneğin entegre olduğunuz bir servis var, bu servisten verileri alıyorsunuz, beraberinde de resim dosyalarını indirmeniz gerekiyor. Her bir veriyi kaydederken resimlerin de indirilmesini beklerseniz bu sizi yavaşlatır. Oysa resimleri arkaplanda çekerseniz bir taraftan hızlıca verileri işlerken bir taraftan da resimleri download edebilirsiniz. Bunun için örnek bir ThreadPool sınıfı buldum, biraz değiştirerek paylaşayım:package com.gg.thread;import java.util.LinkedList;/*** A thread pool is a group of a limited number of threads that are used to* execute tasks.*/public class ThreadPool extends ThreadGroup{private boolean isAlive;private LinkedList taskQueue;private int threadID;private static int threadPoolID;/*** Creates a new ThreadPool.** @param numThreads* The number of threads in the pool.*/public ThreadPool(int numThreads) {super(”ThreadPool-” + (threadPoolID++));setDaemon(true);isAlive = true;taskQueue = new LinkedList();for (int i = 0; i < numThreads; i++) {new PooledThread().start();}}/*** Requests a new task to run. This method returns immediately, and the task* executes on the next available idle thread in this ThreadPool.** Tasks start execution in the order they are received.** @param task* The task to run. If null, no action is taken.* @throws IllegalStateException* if this ThreadPool is already closed.*/public synchronized void runTask(Runnable task) {if (!isAlive) {throw new IllegalStateException();}if (task != null) {taskQueue.add(task);notify();}}protected synchronized Runnable getTask() throws InterruptedException {while (taskQueue.size() == 0) {if (!isAlive) {return null;}wait();}return (Runnable) taskQueue.removeFirst();}/*** Closes this ThreadPool and returns immediately. All threads are stopped,* and any waiting tasks are not executed. Once a ThreadPool is closed, no* more tasks can be run on this ThreadPool.*/public synchronized void close() {if (isAlive) {isAlive = false;taskQueue.clear();interrupt();}}/*** Closes this ThreadPool and waits for all running threads to finish. Any* waiting tasks are executed.*/public void join() {// notify all waiting threads that this ThreadPool is no// longer alivesynchronized (this) {isAlive = false;notifyAll();}// wait for all threads to finishThread[] threads = new Thread[activeCount()];int count = enumerate(threads);for (int i = 0; i < count; i++) {try {threads[i].join();} catch (InterruptedException ex) {ex.printStackTrace();}}}/*** A PooledThread is a Thread in a ThreadPool group, designed to run tasks* (Runnables).*/private class PooledThread extends Thread {public PooledThread() {super(ThreadPool.this, “PooledThread-” + (threadID++));}public void run() {while (!isInterrupted()) {// get a task to runRunnable task = null;try {task = getTask();} catch (InterruptedException ex) {ex.printStackTrace();}// if getTask() returned null or was interrupted,// close this thread by returning.if (task == null) {return;} // run the task, and eat any exceptions it throwstry {task.run();} catch (Throwable t) {uncaughtException(this, t);}}}}}Örnek test kodu da şöyle:public class ThreadPoolTest{public static void main(String[] args) {if (args.length != 2) {System.out.println("Tests the ThreadPool task.");System.out.println("Usage: java ThreadPoolTest numTasks numThreads");System.out.println(" numTasks - integer: number of task to run.");System.out.println(" numThreads - integer: number of threads "+ "in the thread pool.");return;}int numTasks = Integer.parseInt(args[0]);int numThreads = Integer.parseInt(args[1]); // create the thread poolThreadPool threadPool = new ThreadPool(numThreads);// run example tasksfor (int i = 0; i < numTasks; i++) {threadPool.runTask(createTask(i));}// close the pool and wait for all tasks to finish.threadPool.join();System.out.println("done");}/*** Creates a simple Runnable that prints an ID, waits 500 milliseconds, then* prints the ID again.*/private static Runnable createTask(final int taskID){return new Runnable() {public void run() {System.out.println("Task " + taskID + ": start");// simulate a long-running tasktry {Thread.sleep(500);} catch (InterruptedException ex) {ex.printStackTrace();}System.out.println("Task " + taskID + ": end");}};}}

Umarım işinize yarar, manyak kalmaya devam edin…


Social Bookmarking
Add to: Mr. Wong Add to: Digg Add to: Del.icio.us Add to: Reddit Add to: StumbleUpon Add to: Slashdot Add to: Netscape Add to: Furl Add to: Yahoo Add to: Google Add to: Technorati Add to: Newsvine Add to: Ma.Gnolia



Başka Manyak Konular


Lütfen Yorumlarınızı bizimle paylaşın.

Leave a Reply

Site Navigation

Categories

Archives

Meta

Recent Enteries

Recent Comments

FireStats iconPowered by FireStats