Java Thread Pool 예제

2013. 3. 25. 20:04 - 에릭투스

------------------------------------------------------------------------------------

1) ThreadPool관리의 ExecutorService , Callable 객체.

회사에서 Thread관리를 위해 ThreadPool을 사용하는데, 이와 관련하여 조사하게 되었당!


특히, Concurrency API 중에서 Executor, 리턴이 가능한 Callable 및 Future에 대해서 살펴본다.


 참조 : http://javacan.tistory.com/124

------------------------------------------------------------------------------------


Thread를 관리해주는 ExecutorService이다.

Runable 구현된 객체의 경우 return void이므로 값을 받을 수 없기때문에 Callbale 구현 객체를 사용한다.

그에 대한 결과는 Future를 통해 값을 가져올 수 있다.



package com.nkia.thread.pool;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ThreadPoolTest {
	public static final int THREADCOUNT= 10;
	
	public static void main(String[] args) {
		ExecutorService executor = Executors.newFixedThreadPool(THREADCOUNT);
		Future future = executor.submit(new CallableImpl());
		try {
			Integer result = future.get();
			System.out.println("Hello Thread pool Result : "+result);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
	}

}

package com.nkia.thread.pool;

import java.util.concurrent.Callable;

public class CallableImpl implements Callable {

	public Integer call() throws Exception {
		System.out.println("Hello Callble Interface");
		return 26;
	}
}


1) <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
: 주어진 작업을 모두 실행한다.  각 실행 결과값을 구할 수 있는 Future의 List를 리턴한다.

2) <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
: 앞서 invokeAll()과 동일하다.  지정한 시간 동안 완료되지 못한 작업은 취소되는 차이점이 있다.

3) <T> T invokeAny(Collection<? extends Callable<T>> tasks)
 : 작업울 수행하고, 작업 결과 중 성공적으로 완료된 것의 결과를 리턴한다. 
 정상적으로 수행된 결과가 발생하거나 예외가 발생하는 경우 나머지 완료되지 않은 작업은 취소된다.

4) <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit)
 : invokeAny()와 동일하다. 지정한 시간 동안만 대기한다는 차이점이 있다.




package com.nkia.thread.pool.ex02;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class InvokeAllTest {

	final ExecutorService executorService  = Executors.newFixedThreadPool(5);
	final List> list    = new ArrayList>();
	
	public void makeTaskList() {
		for(int i = 0;i<10;i++) {
			list.add(new WorkerTask());	
		}	
	}
 
	public void test() {
		try {  
			//그냥 List를 넘기면 지랄함.
			List> futureList = executorService.invokeAll((Collection>)list);
   
			for(Future future : futureList ) {
				System.out.println(future.get());
			}
			executorService.shutdown();
		} catch (ExecutionException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO 자동 생성된 catch 블록
			e.printStackTrace();
		}
		System.out.println("Completed");
	}
 
	public static void main(String[] args) {
		InvokeAllTest launcher = new InvokeAllTest();
		launcher.makeTaskList();
		launcher.test();
	}
}


package com.nkia.thread.pool.ex02;

import java.util.concurrent.Callable;

public class WorkerTask implements Callable {

	 public String call() throws Exception {
	  for(int i = 0;i<5;i++) {
	   System.out.println(Thread.currentThread().getName() + ":" + "running...");
	   Thread.sleep(500);
	  }
	  return Thread.currentThread().getName() + ":" + "success";
	 }
}


다른 카테고리의 글 목록

자바 기본 공부/기초 이론 카테고리의 포스트를 톺아봅니다