본문 바로가기

전체 글

(636)
멀티 스레드(5) - 스레드 상태 2 앞서서 스레드의 상태에 대한 열거 상수 리스트까지 살펴보았습니다. 이제 이 내용을 바탕으로, 예제 코드를 작성해 보겠습니다.    멀티 스레드(5) - 스레드 상태 1스레드 상태에서부터는 내용이 다소 복잡해집니다. 스레드의 실행 과정은 간단해 보였지만(run 메서드 실행), 이 과정에서는 복잡한 상태 변동이 일어나기 때문이죠. 차근차근 짚어나가 보겠습nozeroslope.tistory.com  아래의 스레드는 특정 타겟 스레드의 상태를 0.5초 주기로 출력하는 스레드입니다.// StatePrintThread.java// 타겟 스레드의 상태를 출력해주는 스레드public class StatePrintThread extends Thread { private Thread targetThread; // 파라미..
멀티 스레드(5) - 스레드 상태 1 스레드 상태에서부터는 내용이 다소 복잡해집니다. 스레드의 실행 과정은 간단해 보였지만(run 메서드 실행), 이 과정에서는 복잡한 상태 변동이 일어나기 때문이죠. 차근차근 짚어나가 보겠습니다.   - 기본적으로 하나의 스레드 객체가 생성이 되면(NEW 상태)- 스케줄링이 아직 되지 않았기 때문에 실행 대기 상태로 전환됩니다(RUNNABLE). - 스케줄링이 되면 CPU 점유 후 run( )을 실행합니다(RUNNING).- RUNNING 상태에서는 run( ) 메서드를 모두 실행하기 전에 스케줄링에 의해  실행 대기 상태로 돌아가 다른 스레드가 실행 상태로 변합니다.   > 이렇게 번갈아가며 스레드는 실행과 실행 대기를 오가며 자신의 run( )을 조금씩 실행합니다.- 실행 상태에서 run( ) 메서드가 ..
멀티 스레드(4) - 동기화 메서드와 동기화 블록 3 앞선 아티클에서 동기화(synchronized) 메서드/블록 선언을 배웠습니다. 이제 우리가 이전에 작성했던 Calculator 예제를 수정해서 동기화 메서드/블록을 실습해 보겠습니다.  앞선 아티클에서 작성했던 코드를 다시 살펴보겠습니다.  // Calculator.javapublic class Calculator { private int memory; public int getMemory() { return memory; } public void setMemory(int memory) { this.memory = memory; try { Thread.sleep(2000); } catch(InterruptedException e) {} System.out.println(Thread.cu..
멀티 스레드(4) - 동기화 메서드와 동기화 블록 2 앞선 아티클에서 공유 객체를 사용하는 과정에 대해서 살펴보았습니다. 그럼 반대로 한 객체를 특정 스레드가 사용 중일 때 다른 스레드가 변경할 수 없도록 만드는 기능도 필요해질 것입니다.  멀티 스레드 체계에서 딱 하나의 스레드만 실행할 수 있는 영역을 임계 영역(critical seciton)이라고 칭하는데, 이 임계 영역은 동기화(synchronized) 메서드/블록을 통해서 설정이 가능합니다. 스레드가 어떤 객체 내부의 동기화 메서드 / 블록에 들어가면, 즉시 객체가 잠기며 다른 스레드가 해당 임계 영역의 코드를 실행하지 못하게 됩니다.      ○ synchronized 사용법 기본적으로 동기화 메서드를 선언할 때는 메서드 선언에 synchronized 키워드를 포함하면 됩니다. 인스턴스, stat..
멀티 스레드(4) - 동기화 메서드와 동기화 블록 1 공유객체라는 개념을 이제부터 설명해 보겠습니다. 싱글 스레드일 경우에는 한 개의 스레드가 객체를 단독으로 사용하기 때문에 큰 이슈가 없습니다. 하지만 멀티 스레드일 경우에는 여러 개의 스레드가 객체를 공유하며 작업하는 경우가 많습니다. 이 때, 하나의 객체를 스레드 A가 사용하는데 도중에 스레드 B에 의해 상태가 변경될 수도 있습니다. 결국, 이럴 경우에는 스레드 A가 의도했던 방향과 다른 결과가 발생할 수도 있습니다(누군가 쓰던 계산기 프로그램을 다른 사람이 와서 만지는 상황과 비슷하죠). 예를 들어, User1 스레드가 Cacluator 객체 안의 memory 필드에 100을 저장하고 바로 2초간 일시 정지 상태가 되었습니다. 그런데, 그 사이에 User2 스레드가 memory 필드 값을 50으로 변..
멀티 스레드(3) - 스레드 우선순위 2 앞서서 살펴본 스레드 스케줄링은 두 가지 방식이 있습니다. (1) 우선순위 (Priority) 방식과 (2) 순환 할당(Round-Robin)이죠. 우선순위 방식은 말 그대로, 할당된 우선 순위에 따라 우선순위가 높은 스레드가 실행 상태를 더 많이 가져가는 것입니다. 순환 할당 방식은 시간 할당량(Time Slice)을 배분하고 정해진 시간만큼 실행한 다음 다시 다른 스레드를 실행하는 방식을 의미합니다.  여기서 우선순위 방식은 직접 우선순위 부여가 가능하므로 직접 코드로 제어가 가능하지만, 순환 할당 방식은 가상 머신에 의해 컨트롤되고 정해지는 방식으로 코드 제어가 불가능하다는 점을 기억해야 합니다.       우선순위는 1~10까지 부여됩니다. 주의할 점은 우선순위는 10이 가장 높고, 1이 가장 낮..
멀티 스레드(3) - 스레드 우선순위 1 스레드에 있어서 '우선순위'개념은 왜 필요한 것일까요? 우선, 기본적으로 하나의 코어에서는 하나의 스레드를 실행한다고 이해하면 되겠습니다. 이 때, 코어의 개수에 따라서 동시성(Concurrency) / 병렬성(Parallelism)을 갖게 됩니다. 여기서 "동시성"과 "병렬성"의 개념적 차이는 무엇일까요?  대표적인 설명을 들자면, 이는 싱글 코어와 멀티 코어의 차이로 생각하시면 되겠습니다. [동시성]은 하나의 코어에서 멀티 스레드가 번갈아 실행되는 성질을 의미합니다. [병렬성]은 말 그대로 멀티 코어에서 각각의 스레드를 동시에 실행하는 성질을 의미하게 됩니다.  즉, 싱글 코어에서는 멀티 스레드 작업이 실제로는 병렬로 실행되는 것은 아닙니다. 번갈아 작업하는 동시성 작업이 워낙 빨라서 사람에게는 병럴..
멀티 스레드(2) - 작업 스레드 개념 : 스레드 이름 설정/호출 우리가 사용하게 되는 스레드(메인, 작업 스레드)들은 각각 이름을 갖습니다. 이름 자체가 클래스나 메서드처럼 아주 중요한 역할까지 하는 것은 아니지만, 디버깅 과정이라든지 여러 방면에서 작업을 어떻게 진행하는지 확인하는 목적으로 사용되기도 합니다.  기본적으로 메인스레드는 "main"이며, 우리가 생성하는 작업 스레드는 "Thread-n"(n은 스레드 번호)이라는 이름을 갖게됩니다. 여기서 Thread-n 대신에 다른 이름을 설정하고 싶다면 Thread 클래스의 메서드 setName( ), 그리고 getName( )을 사용하면 됩니다.  thread.setName("thread name");thread.getName();  setName( )과 getName( )은 Thread의 인스턴스 메서드이므로, ..