------------------------------------------------------------------------------------
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); Futurefuture = 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"; } }
'자바 기본 공부 > 기초 이론' 카테고리의 다른 글
Map to Object 와 Object to Map (0) | 2013.04.23 |
---|---|
Effective 자바 - 개초보가 본디.. (1) | 2013.04.01 |
Java Annotation 기초(Basic) (0) | 2012.12.24 |
OracleDataSource를 사용한 JDBC 기초이론 (0) | 2009.06.23 |
자바 JDBC 기초 (0) | 2009.06.23 |