본문 바로가기

Programming/JAVA

(139)
멀티 스레드(9) - 스레드 풀 4 : 블로킹 방식의 작업 완료 통보 1 작업 완료 통보는 블로킹 방식과 콜백 방식으로 나뉩니다. 우선, 블로킹 방식에 대해서 먼저 살펴보도록 하겠습니다.  ExecutorService의 submit( ) 메서드는 매개값으로 준 Runnable 또는 Callable 작업을 스레드풀의 작업 큐에 저장하고 즉시 Future 객체를 리턴하게 됩니다.  리턴 타입메서드명(파라미터)설명Futuresubmit(Runnable task)- Runnable 또는 Callable을 작업 큐에 저장- 리턴된 Future를 통해 작업 처리 결과를 얻음 Future submit(Runnable task, V resutl) Future submit(Callable task)  여기서 Future 객체는 작업 결과가 아니라, 작업이 완료될 때까지 기다렸다가(=지연, 즉..
멀티 스레드(9) - 스레드 풀 3 : 작업 생성과 처리 요청 2 앞선 아티클에서 살펴본 작업처리 요청과 관련된 자세한 내용을 더 살펴보겠습니다.    멀티 스레드(9) - 스레드 풀 3 : 작업 생성과 처리 요청 1○ 작업 생성 하나의 작업은 Runnable 또는 Callable 구현 클래스로 표현하게 됩니다. 두 구현 클래스의 차이는 리턴 값 유무의 여부인데, 아래 예시를 살펴보겠습니다.  Runnable 구현 클래스Callablenozeroslope.tistory.com  작업 처리 요청은, ExecutorService의 작업 큐에 Runnable 또는 Callable 객체를 넣는 행위를 의미합니다. ExecutorService는 작업 처리 요청을 위해 당므 두 가지 종류의 메서드를 제공합니다.  리턴 타입메서드 명(파라미터)설명voidexecute(Runnabl..
멀티 스레드(9) - 스레드 풀 3 : 작업 생성과 처리 요청 1 ○ 작업 생성 하나의 작업은 Runnable 또는 Callable 구현 클래스로 표현하게 됩니다. 두 구현 클래스의 차이는 리턴 값 유무의 여부인데, 아래 예시를 살펴보겠습니다.  Runnable 구현 클래스Callable 구현 클래스Runnable task = new Runnable( ) {    @Override    public void run( ) {        // 스레드가 처리할 내용    }}Callable task = new Callable)( ) {    @Override    public T call( ) throws Exception {        // 스레드가 처리할 내용        return T;    }} Runnable의 run( ) 메서드는 리턴값이 없고, Callab..
멀티 스레드(9) - 스레드 풀 2 : 스레드 풀 생성 및 종료 3 ○ 스레드풀의 종료 스레드풀의 스레드는 기본적으로 데몬 스레드가 아니기에, main 스레드가 종료되더라도 작업을 처리하기 위해 계속 실행 상태를 유지하게 됩니다. 그래서 main( ) 메서드 실행이 끝나도 애플리케이션 프로세스가 종료되지 않습니다. 종료를 위해서는 스레드풀을 종료시켜 스레드들이 종료 상태가 되도록 처리해야 합니다.  ExecutorService는 종료와 관련해, 다음 세 개의 메서드를 제공합니다.  리턴 타입메서드명(파라미터)설명voidshutdown( )현재 처리 중인 작업뿐만 아니라 작업 큐에 대기하고 있는 모든 작업을 처리한 뒤에 스레드폴을 종료한다.ListshutdownNow( )현재 작업 처리 중인 스레드를 interrupt해서 작업 중지를 시도하고, 스레드풀을 종료시킨다. 리턴..
멀티 스레드(9) - 스레드 풀 2 : 스레드 풀 생성 및 종료 2 앞선 아티클에서 newCachedThreadPool( )로 생성한 스레드 풀에 대해서 살펴보았습니다. 이번에는 newFixedThreadPool(int nThreads)의 사용에 대해서 살펴보겠습니다.    멀티 스레드(9) - 스레드 풀 2 : 스레드 풀 생성 및 종료 1○ 스레드풀 생성 앞선 스레드풀 개념에서 설명했듯이, ExecutorService 인터페이스의 구현 객체는 Executors 클래스의 static 메서드를 이용해 생성하게 됩니다. 아래 두 가지 메서드 중 하나를 사용하nozeroslope.tistory.com    newFixedThreadPool(int nThreads) 메서드로 생성된 스레드풀의 초기 스레드 개수는 역시 0개 입니다. 그리고 코어 스레드 수는 nThreads입니다...
멀티 스레드(9) - 스레드 풀 2 : 스레드 풀 생성 및 종료 1 ○ 스레드풀 생성 앞선 스레드풀 개념에서 설명했듯이, ExecutorService 인터페이스의 구현 객체는 Executors 클래스의 static 메서드를 이용해 생성하게 됩니다. 아래 두 가지 메서드 중 하나를 사용하게 됩니다.  메서드명(파라미터)초기 스레드 수코어 스레드 수최대 스레드 수newCachedThreadPool( )00Integer.MAX_VALUEnewFixedThreadPool(int nThreads)0nThreadsnThreads  * 초기 스레드 수 : ExecutorService 객체가 생성될 때 기본적으로 생성되는 스레드 수를 의미 * 코어 스레드 수 : 스레드 수 증가 후, 사용하지 않는 스레드를 스레드 풀에서 제거할 때 최소한으로 유지해야 할 스레드 수 * 최대 스레드 수 ..
멀티 스레드(9) - 스레드 풀 1 : 스레드 풀의 정의 스레드를 활용한 병렬 작업이 증가하게 되면, 어플리케이션 성능이 저하될 수 밖에 없습니다. 스레드 생성과 스케줄링으로 인해서 CPU 사용량이 늘어나고, 메모리의 사용량이 늘어나기 때문입니다. 그래서 스레드 사용의 폭증을 막기 위해서 스레드 풀(Thread Pool)을 사용하게 됩니다.  스레드 풀은,  - 작업 처리에 사용되는 스레드 최대 개수를 제한해 놓고 - 작업 큐(Queue)에 들어온 작업들을, 각각의 스레드가 하나씩 맡아서 처리합니다. - 할당 작업 처리가 끝난 스레드는, 다시 작업 큐에서 새로운 작업을 가져와 처리합니다. 이런 구조이기 때문에, 만약에 작업 요청이 갑작스럽게 폭증한다고 해도, 스레드의 개수는 정해져있기 때문에 스레드 증가로 인한 어플리케이션 성능 저하가 발생하지 않는 것입니다...
멀티 스레드(8) - 스레드 그룹 5 앞선 아티클에서 ThreadGroup 메서드를 살펴보았습니다. 이제 이 내용을 기반으로 예제를 작성해 보겠습니다.    멀티 스레드(8) - 스레드 그룹 4앞선 아티클에서 우리는 스레드 그룹 생성 기능을 살펴보았습니다.    멀티 스레드(8) - 스레드 그룹 3스레드 그룹을 명시적으로 선언하는 방법도 있습니다. ThreadGroup 생성자를 이용해서 객체nozeroslope.tistory.com  아래 예제에서 스레드 그룹을 생성하고, 정보를 출력한 다음 3초 후 스레드 그룹의 interrupt( ) 메서드를 호출하여 스레드 그룹에 포함된 모든 스레드를 일괄 종료시킵니다. 여기서는 Thread 클래스의 생성자도 중요하게 사용되니 다시 확인합니다.   멀티 스레드(8) - 스레드 그룹 3스레드 그룹을 명시..