Future, Callable, Executor를 이용한 Thread
1. ExecutorService
- 자바5에서 멀티스레드와 콜백을 간편하게 사용하기 위하여 ExecutorService를 사용한다.
1) 사용법
- 작업 대상의 Callable 객체를 만들고 ExecutorService에 등록한 다음 Future 객체를 반환 받는다.
- 작업 결과는 Future를 통해 얻는다.
2. 예제
1) FindMax.java
import
java.util.concurrent.Callable;
public
class
FindMax
implements
Callable<Integer>{
private
int
[] data;
private
int
start;
private
int
end;
FindMax(
int
[] data,
int
start,
int
end){
this
.data = data;
this
.start = start;
this
.end = end;
}
public
Integer call() {
int
max =
0
;
for
(
int
i = start; i<end; i++) {
if
(data[i] > max) {
max = data[i];
}
}
return
max;
}
}
- 값을 비교하여 max값을 반환 한다.
- Callable 인터페이스는 어떤 값도 반환하는 call() 를 제공한다.
2) MultiThreadMaxFinder.java
import
java.util.concurrent.ExecutionException;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
java.util.concurrent.Future;
public
class
MultiThreadMaxFinder {
public
static
int
max(
int
[] data)
throws
InterruptedException, ExecutionException {
if
(data.length ==
1
) {
return
data[
0
];
}
else
if
(data.length ==
0
) {
throw
new
IllegalArgumentException();
}
//작업 분할
FindMax task1 =
new
FindMax(data,
0
, data.length/
2
);
FindMax task2 =
new
FindMax(data, data.length/
2
, data.length);
//두 개의 스레드 생
ExecutorService service = Executors.newFixedThreadPool(
2
);
Future<Integer> future1 = service.submit(task1);
Future<Integer> future2 = service.submit(task2);
return
Math.max(future1.get(), future2.get());
}
public
static
void
main(String[] args)
throws
InterruptedException, ExecutionException {
int
[] values = {
1
,
4
,
5
,
7
,
10
,
2
,
77
,
100
,
55
,
9
,
11
,
23
};
System.out.println(MultiThreadMaxFinder.max(values));
}
}
- Callable 객체를 Executor 에 추가하여 사용한다.
- Executor는 각 객체의 스레드 실행
3. 장점
- 멀티 코어 환경에서 두배의 가까운 성능을 보인다.
- 비동기 문제를 해결 할 수 있다.
'Back-End > Java_2' 카테고리의 다른 글
[Java] Java8 - 함수형인터페이스 그리고 람다의 활용 (0) | 2018.06.16 |
---|---|
[Java] Java8 - 동작파라미터화 (predicate 활용) (0) | 2018.06.10 |
[Java] Thread에서 데이터 반환(폴링, 콜백) - Receive data by using thread polling, callback (0) | 2017.10.15 |
[Java] Thread 만들기 - To create Threads (0) | 2017.10.15 |
[Java] InputStream - 입력스트림 (0) | 2017.08.22 |