-
동기비동기, 스레드풀TIL 2021. 1. 30. 14:55
동기 비동기란?
동기
코드의 흐름이 하나로 흐른다.
비동기
코드의 흐름이 비동기 호출 시점에 나뉘며 호출한 main스레드는 자기 갈길 가고 작업 스레드도 main에서 빠져나와 자기의 갈길을 간다.
안드로이드 어플을 만들 때 사용한 적이 있는데 로그인 버튼을 활용할 때 사용했다.
처음에는 동기적으로 만들었다 -> 로그인 버튼을 누르고 서버에서 api를 받아올 때 동안 화면이 멈춘다.
그래서 비동기적으로 다시 만들었다 -> 서버에서 api를 받아올 동안 다른 행동이 가능해 졌다.
이처럼 비동기가 없는 곳이 없을 정도로 많은 곳에서 활용되고 있지만 너무 어려운 주제이다.
또 블록킹과 논 블록킹이란 무엇인가?
동기, 비동기 : 처리해야 할 작업들을 어떤 흐름으로 처리할 것인가에 대한 관점 콜백이 함수마다 있음
블록킹, 논 블록킹 : 처리되어야 하는 작업이 , 전체적인 작업 흐름을 막느냐 안 막느냐에 대한 관점 작업이 끝나면 콜백
블록킹은 작업을 시키고 기다리는 작업을 시킨 곳에서 흐름을 막고 작업이 끝나길 기다리는 것 스레드의 작업이 끝나면 return
논 블록킹은 작업을 시키고 작업의 흐름을 막지 않고 계속 가는 것 바로 return해주고 작업은 계속 함 main에서 중간중간 작업의 현재 진행상황을 물을 수 있음
homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/
자바 스레드 풀
이게 이벤트 방식인지는 잘 모르겠다.
특정 요청이 오면 작업을 스레드 풀에 넣어주는데...
스레드 풀은 매번 new로 스레드를 만들지 말고 여러 스레드를 가지고 있는 공간을 만드는 것이다.
개발자는 그 공간에 작업만 넣어주면 안에서 알아서 스레드를 할당하고 작업을 돌린다.
자바에서는 java.util.concurrent 패키지에서 Executorservice를 제공해줘 이것으로 만들 수 있다.
Executorservice executorservice = Excutores.newFixedThreadPool(2); //스레드가 2개인 스레드 풀 생성
작업이 돌아갈 풀을 만들었으니 작업을 만들어 보자
작업은 runable과 callable로 만들 수 있다.
차이점은 리턴 값이 없냐 , 있냐로 나뉜다.
Executorservice는 작업을 처리 요청에 execute와 submit을 사용하는데 excute는 작업 도중 예외가 나오면 그 스레드를 스레드 풀에서 제거한다. 그리고 새로운 스레드를 생성한다. -> 오버헤드가 발생한다.
submit은 예외가 발생해도 스레드를 제거하지 않고 재사용을 한다.
그래서 submit을 사용하는 게 바람직하다.
executorservice.submit(작업);
Executorservice는 작업을 받고 나면 바로 리턴을 넘겨준다(Future <?>).
여기서 위에서 본 runnable, clallable의 리턴 값을 얻을 수 있다.
runnalble 작업은 future.get()을 해도 null을 줄 것이고
callable작업은 리턴 값을 뭐로 했느냐에 따라 그 값을 줄 것이다.
만약 예외가 있는 작업이었다면 get을 하면 예외를 던져줄 것이다.
get을 호출했을 때 호출한 곳은 블록킹 상태가 된고 작업이 끝나기를 기다린다.
Executorservice는 get 말고도 여러 메서드를 제공한다. 작업을 취소시키거나, 작업의 완료 여부 등을 알 수 있다.
위에 있는 방식에 한 가지를 더 추가하면 콜백을 구현할 수 있다.
바로 작업 도중에 완료 여부를 통해 외부에 있는 함수를 호출하는 거다.
직접 구현해도 되고 java에서 제공하는 CompletionHandler <V, A>를 사용해도 된다.
인터페이스이기 때문에 바로 구현 객체를 만들어야 하는데 안에 함수는 성공, 실패 함수가 들어있다.
그냥 껍데기만 제공하는 거다. V는 결과값의 타입이고 A는 추가로 줄 참고 값이다.
www.clien.net/service/board/lecture/15872844
'TIL' 카테고리의 다른 글
쉘 스크립트와 mysql (0) 2021.01.30 Docker란? (0) 2021.01.30 2021.01.30 기록장 (0) 2021.01.29 2021.01.29 기록장 (0) 2021.01.28 2021.01.28 기록장 (0) 2021.01.27