Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- nGrinder
- java
- cloud native
- Microservice
- ingress
- 클라우드 네이티브
- cloud native java
- CRD
- spring microservice
- MySQL
- 코틀린
- 동기화
- kubernetes
- 헬름
- 쿠버네티스
- ansible
- Semaphore
- Algorithm
- decorator 패턴
- 클라우드 네이티브 자바
- Stress test
- devops
- Adapter 패턴
- 머신러닝
- 마이크로서비스
- MSA
- Spring
- 익명클래스
- Kotlin
- 자바
Archives
- Today
- Total
카샤의 만개시기
동기화 클래스 5편 - Executors, FutureTask, Future 본문
실제 결과가 필요한 시점보다 훨씬 이전에 시간이 많이 필요한 작업을 미리 해두는 용도로 사용합니다.
FutureTask는 시작 전 대기, 시작됨, 종료 3가지 상태로 구분할 수 있고 한번 종료상태가 되면 더 이상 상태가 바뀌지 않습니다.
Future.get()메소드는 FutureTask의 작업이 종료되면 그 결과를 즉시 알려줍니다.
class MyRunnable implements Runnable {
private final long waitTime;
public MyRunnable(int timeInMillis) {
this.waitTime = timeInMillis;
}
@Override
public void run() {
try {
Thread.sleep(waitTime);
System.out.println(Thread .currentThread().getName());
} catch (InterruptedException ex) { }
}
}
class Main {
public static void main(String[] args) {
MyRunnable myrunnableobject1 = new MyRunnable(1000);
MyRunnable myrunnableobject2 = new MyRunnable(2000);
FutureTask<String>
futureTask1 = new FutureTask<>(myrunnableobject1,
"FutureTask1 is complete");
FutureTask<String>
futureTask2 = new FutureTask<>(myrunnableobject2,
"FutureTask2 is complete");
// 2개의 Thread를 가진 ThreadPool 생성
ExecutorService executor = Executors.newFixedThreadPool(2);
// futureTask를 ExecutorService에 보내서 실행
executor.submit(futureTask1);
executor.submit(futureTask2);
while (true) {
try {
// 모든 future task 완료
if (futureTask1.isDone() && futureTask2.isDone()) {
System.out.println("FutureTask Complete");
// 수행중인 Future Task가 모두 종료되면 종료. (자동으로 Executor가 제거되지 않는다.)
// showdownNow()는 수행중인 task가 있더라도 인터럽트시켜 강제 종료한다.
executor.shutdown();
return;
}
if (!futureTask1.isDone()) {
// get()을 호출하면 쓰레드 작업이 완료 될때까지 기다림
System.out.println("FutureTask1 output = "
+ futureTask1.get());
}
System.out.println("Waiting for FutureTask2 to complete");
// 250ms시간동안 쓰레드 결과값이 나오길 기다림.
String s = futureTask2.get(250, TimeUnit.MILLISECONDS);
if (s != null) {
System.out.println("FutureTask2 output=" + s);
}
}
catch (Exception e) {
Sysmtem.out.println("Exception: " + e);
}
}
}
}
'Java > POJO' 카테고리의 다른 글
동기화 클래스 4편 - Exchanger (0) | 2019.07.03 |
---|---|
동기화 클래스 3편 - CyclicBarrier (0) | 2019.07.03 |
동기화 클래스 2편 - CountDownLatch (0) | 2019.07.03 |
동기화 클래스 1편 - 세마포어(Semaphore) (0) | 2019.07.03 |
Java의 동기화 (atomic, volatile, synchronized) (0) | 2019.07.03 |
Comments