Java/Thread (7) 썸네일형 리스트형 [Java] 멀티 스레드(Multi Thread) (7) : 스레드풀, 작업의 완료 1 지연 완료 객체 (Pending Completion Object) : submit() 6편에서 다뤘듯이 submit()에 의해 처리가 요청된 작업은 종료시 처리 결과를 Future 객체로 리턴한다. 이때 Future 객체는 get() 메서드를 통해 결과값을 리턴 받을 수 있는데 get()을 호출하면 스레드가 작업을 완료할때까지 블로킹 되었다가 작업이 완료되면 결과를 리턴한다. 그래서 Future을 지연 완료 객체라고 한다. get() 메서드를 호출할 경우, 모든 작업이 블로킹 되기 때문에 get() 메소드는 새로운 스레드거나, 스레드 풀의 다른 스레드에서 실행 되어야 한다. 리턴값이 없는 경우 submit() 메서드의 인자로 Runnable 객체를 줄 경우, 리턴값이 없게 된다. 이때 Future.get.. [Java] 멀티 스레드(Multi Thread) (6) : 스레드풀의 작업의 생성과 처리 작업 생성 각 작업은 Runnalbe 혹은 Callble 구현 클래스로 표현된다. Runnable과 Callable의 차이점은 리턴값의 유무이다. 다음은 Runnable과 Callable 구현 클래스의 작성 예시이다. Runnable task = new Runnable() { @Override public void run() { // ... } } Callable callable = new Callable() { @Override public T call() thorws Exception { // ... return T; } } callable 구현객체는 리턴타입이 있어야 하며 리턴타입을 제네릭으로 선언한다. 그리고 runnable과 callalbe 구현 클래스는 각각 run(), call() 메서드를 .. [Java] 멀티 스레드(Multi Thread) (5) : 스레드풀의 생성과 종료 컴퓨터의 작업량이 점점 많아지면... 병렬로 처리할 작업의 양이 많아지면 자연스럽게 스레드의 양도 많아지게 된다. 스레드의 양이 많아지면 더 많은 스레드의 생성과 이에 따른 스케줄링으로 인해 CPU의 메모리 사용량은 점점 많아지게 되고, 컴퓨터의 성능 저하로 이어지게 된다. 이를 방지하기 위해 한 시스템 내에서 처리될 수 있는 스레드의 양을 제한할 필요성이 있고, 이때 사용할 수 있는것이 스레드풀(Thread Pool)이다. 스레드풀 (Thread Pool) 아래 그림을 보면 스레드풀(Thread Pool)에 자리가 남을 경우, 작업 큐(Task Queue)에서 스레드를 가져온다. 그리고 새로이 처리 되고자 하는 스레드는 작업 큐에 푸쉬되게 된다. 스레드 풀에 있는 스레드의 개수는 제한된 숫자를 넘을 수.. [Java] 멀티 스레드(Multi Thread) (4) - 스레드 상태 제어 2 1편에 이어 join() / wait() / notify() / stop() 에 관한 이야기를 이어가겠습니다. join() (실행 -> 일시정지) 상황에 따라 스레드가 잠깐 멈췄다가 다른 스레드가 종료 된 후 이어서 실행해야 되는 경우가 있다. 예를 들어 ThreadA가 ThreadB에 의해 계산된 결과값을 사용하고 싶다고 하자. 이 경우 ThreadA는 ThreadB가 종료될 때까지 기다려야 한다. 이경우 ThreadA의 영역에 ThreadB의 join() 메소드를 호출하면 ThreadB가 종료될때 까지 기다리게 된다. public class SumThread extends Thread { public int sum = 0; public int getSum() { return this.sum; } pu.. [Java] 멀티 스레드(Multi Thread) (3) - 스레드 상태 제어 1 스레드의 상태 스레드 객체를 생성 후, 실행하면 바로 실행이 될까? 당연히 아니다. 앞선 글에서도 한번 언급했지만, 멀티 스레드 어플리케이션은 마치 여러개의 스레드가 동시에 실행되는것 같아 보이지만, 실제로는 스케줄링을 통해 번갈아 가면서 CPU를 할당받아 실행이 된다. 그렇기 때문에 실제 스레드를 start() 메소드를 이용해 실행을 하면 실행 대기(RUNNABLE) 상태가 되고, 이후 스케줄링을 통해 CPU를 할당 받으면 드디어 스레드가 실행(RUNNING)이 된다. 이후 다시 CPU를 잃게 되면 실행 대기 상태로 돌아가고, 이를 계속 반복하다가 스레드의 모든 활동이 끝나면 종료(TERMINATED)가 된다. 스레드의 일시정지 스레드는 실행 상태에서 실행 대기 상태가 아닌 일시 정지 상태로 가기도 한.. [Java] 멀티 스레드(Multi Thread) (2) : 동기화(Synchronization) 주문과 가격변동이 동시에 일어나면? 아주 간단한 물건 주문 앱이 있다고 생각해보자.(실제 주문 플로우는 이렇게 허술하게 만들지 않는다) 이 어플리케이션은 물건의 이름, 가격, 수량등을 각각 하나의 객체로 묶어 관리한다. 이때 한 사람이 3000원짜리 볼펜을 구매하려고 볼펜을 장바구니에 넣고 결제를 진행한다. 이때 결제를 진행하는 동안 가게 주인은 볼펜을 3500원으로 변경한다. 그러면 무슨일이 일어날까? 3000원인줄 알고 구매를 결심한 소비자는 구매버튼을 클릭했다. 하지만 구매정보를 불러오는 사이에 가격은 변경되었고 졸지에 3500원짜리 볼펜은 사는 결과를 낳았다. 이러한 문제가 발생하는 이유가 무엇일까? 객체를 공유하는 여러개의 스레드 위 예제에서 Pen 객체는 소비자도 사용하면서 동시에 가게 주인도.. [Java] 멀티 스레드(Multi Thread) (1) : 멀티 스레드 생성과 실행 멀티 태스킹의 세계 우리는 컴퓨터로 동영상을 보면서 카톡을 보내고, 동시에 어플리케이션을 다운받는다. 이런것이 가능한 이유는 무엇일까? 바로 우리의 컴퓨터가 멀티 태스킹 기능을 제공하기 때문이다. 멀티 태스킹은 말 그대로 동시에 여러 작업을 실행하는 것을 말한다. 멀티 태스킹은 단순히 사용자의 편의성뿐만 아니라 컴퓨터의 공용자원을 더욱 효율적으로 사용할 수 있게 만들어준다. 멀티태스킹(multitasking) 또는 다중작업은 다수의 작업(혹은 프로세스)이 중앙 처리 장치(이하 CPU)와 같은 공용자원을 나누어 사용하는 것을 말한다. - 위키백과 어플리케이션 내부의 멀티태스킹 한 컴퓨터에서 동시에 여러 프로세스가 실행된다면, 마찬가지로 하나의 어플리케이션 내부에서 여러가지의 작업이 동시에 실행될 순 없을까.. 이전 1 다음