java에서 thread를 사용할 때 걍 Thread를 사용하였는데 ExecutorService라고 병렬처리를 지원하는 아주 고상한넘이 있는줄 이제 알았다. 참내..
Thread와 달리 ExecutorService는 비슷한 작업을 하는 스레드를 병렬로 처리하고자 할 때 주로 사용될수 있겠다.
그리고 Thread와 다른 ExecutorService만의 특장점은 스레드의 처리 결과를 받아볼수 있다는것~! 졸 좋다.
ExecutorService concurrentService = Executors.newFixedThreadPool(5);
for(int i=0; i<5; i++) {
concurrentService.submit(new MyThread("threa param"));
}
5개의 스레드풀을 갖는 병렬처리 ExecutorService를 만들고 MyThread라는 Callable<T>를 구현한 클래스 객체를 인자로 하여 submit을 수행한다.
submit순간 MyThread의 call메소드가 호출된다.
public class MyThread implements Callable<List<String>>
{
public MyThread(String param) {
..
}
public List<String> call() throws Exception {
....
return stringList; // List<String>형식의 결과값 리턴
}
}
MyThread함수는 Callable<>를 implements해야 하며 리턴값은 지네릭을 통해 객체를 넘길수도 있다.
ExecutorService의 최대의 장점은 스레드 처리 결과값을 리턴받을 수 있다고 하였는데 그러기 위해서는 java.util.concurrent.Future라는 추상클래스의 도움을 받아야 한다.
List<Future<List<String>>> results = new ArrayList<Future<List<String>>>(); //결과를 리턴받을 객체를 생성
results.add(concurrentService.submit(new MyThread("threa param"))); // 스레드를 submit할 때 결과객체를 얻어냄.
List<String> ret = ((Future<List<String>>)results.get(0)).get(); // 결과객체로부터 결과값을 받음.
해당 결과객체(Future)로부터 결과값을 받