[Java] Thread에서 데이터 반환(폴링, 콜백) - Receive data by using thread polling, callback
Back-End/Java_2 2017. 10. 15. 16:17Thread에서 데이터 반환(폴링, 콜백) - Receive data by using thread polling, callback
1. thread의 데이터 반환
- run(), start() 는 어떤 값도 반환하지 않는다.
- 특정한 방법이 필요하다
2. 일반 적인 데이터 반환
1) ThreadTest.java
- getResult() 를 이용하여 파일 쓰기가 끝나면 파일 이름을 반환한다.
2) ThreadInterface.java
- getResult() 를 호출하여 확인한다.
3) 문제
- 그러나 콘솔에는 null 값이 출력되거나 운 좋다면 파일 명이 나올 수 있다.
- 스레드의 처리 속도와 main() 의 속도가 불일치(경쟁조건) 하다.
3. 폴링(polling)을 이용한 경쟁조건 해결
1) 폴링(polling) 이란?
- 동기화를 목적으로 상태를 주기적으로 검사하여 일정 조건이 만족하면 처리하는 방법
2) 위의 문제 해결
- 반복적으로 null 을 체크하여 아니라면 출력한다.
3) 문제
- 체크하기 위하여 너무 많은 일을 한다.
- 메인 스레드가 작업종료 상태를 계속 확인해야 하기 때문에 다른 스레드가 일할 시간 없다(성능저하)
4. 콜백(callback) 으로 문제 해결
1) 콜백(callback) 이란?
- 단일 스레드의 작업이 끝났을 때 자신을 생성한 클래스를 호출하여 메인 스레드에게 결과를 알려준다.
- 폴링의 무한 루프로 결과값을 체크하는 문제 해결
1) ThreadTest.java
- 정적 메소드를 호출하여 결과값을 전달한다.
2) ThreadInterface.java
- 반환 값을 받기위한 정적메소드
3) 개선
- 정적메소드를 호출하는 것보다 인스턴스를 생성하여 반환값을 받는 것이 더 좋다.
4) 문제
- 스레드의 순서가 없다. 먼저 종료되는 스레드의 결과를 먼저 받는다.
- 순서가 필요한 결과 값이라면 다른 방법이 필요하다.(Future, callable, Executor)
'Back-End > Java_2' 카테고리의 다른 글
[Java] Java8 - 함수형인터페이스 그리고 람다의 활용 (0) | 2018.06.16 |
---|---|
[Java] Java8 - 동작파라미터화 (predicate 활용) (0) | 2018.06.10 |
[Java] Future, Callable, Executor를 이용한 Thread (0) | 2017.10.15 |
[Java] Thread 만들기 - To create Threads (0) | 2017.10.15 |
[Java] InputStream - 입력스트림 (0) | 2017.08.22 |