개요자바는 스레드를 통해 작업들을 병렬적으로 처리할 수 있다.하지만 Runnable 인터페이스를 통해 작업을 제출하게 되면, 반환값을 받을 수 없다는 단점이 있다.Executor 프레임워크는 이러한 문제를 해결하기 위해 Callable과 Future라는 인터페이스를 도입했다. 이전 글에 이어지는 내용이다. Runnable vs Callablepublic interface Runnable { void run();}Runnable 인터페이스는 반환 값이 없으며, 예외를 던질 수도 없다. public interface Callable { V call() throws Exception;}Callable 인터페이스는 값을 반환할 수 있으며, 예외를 던질 수 있다. Callable과 Future 사용class ..
개요스레드 생성 과정은 간략하게 아래와 같은 과정이 이루어진다.메모리 할당 -> 시스템 콜(커널 모드 전환) -> 운영체제에서 스레드 생성 -> 운영체제 스케쥴러 관리 -> 작업이 완료되면 스레드 종료스레드 생성 과정은 너무 무겁다.또한 서버의 자원은 한정되어 있기에, 스레드를 무한하게 생성할 수도 없다. 스레드 풀을 이용하면 스레드들을 미리 만들어서 보관해놓고 생성 과정을 일부 생략하여 작업을 빠르게 진행시킬 수 있으며, 최대 스레드 수를 설정하여 서버의 자원을 초과하지 않도록 할 수 있다. Executor 프레임워크자바에서는 Executor 프레임워크를 통해 스레드 풀 관리를 간단하고 효율적으로 처리할 수 있다. public interface ExecutorService extends Execut..
개요동기와 비동기, 블로킹과 논블로킹, 많이 들어본 용어이지만 가끔씩은 헷갈린다.어떤 기준으로 나뉘었는지 알아보고 이 두 종류 조합도 알아보자. 동기와 비동기동기와 비동기를 나누는 기준은 '작업들을 순차적으로 수행하는지'에 대한 관점이다.동기는 작업을 순차적으로 수행하고, 비동기는 작업들이 순서에 상관없이 수행된다. 블로킹과 논블로킹블로킹과 논블로킹을 나누는 기준은 '작업의 제어권을 어떻게 처리하느냐'에 대한 관점이다.다른 말로 '현재 진행중인 작업이 block 되느냐 안되느냐'이다.A 작업이 B 작업을 호출할 때 제어권을 A가 B에게 넘기게 되어서 A 작업이 중단된다면, 해당 상황은 블로킹이다.반대로 A 작업이 B 작업을 호출해도 제어권을 A 작업이 그대로 갖고 있어 작업이 중단되지 않는다면, 해당..