본문 바로가기

Programming/JAVA

(139)
멀티 스레드(6) - 스레드 상태 제어 5 : 스레드 간 협업 3 또 하나의 스레드 간 협업 예제를 작성해 보겠습니다. 조금 복잡하지만 차례차례 읽어보겠습니다.  - 우선 데이터를 저장하는 생산자 스레드가 있습니다. - 이 생산자 스레드는 공유 객체(DataBox)에 데이터를 저장합니다. - 그럼 소비자 스레드에서는 이 데이터를 읽어들입니다. - 이 과정을 순서대로 교대하며 진행하는 작업을 구현해야 합니다. - 단, 제약 사항이 있습니다. 생산자 스레드는 소비자 스레드가 읽기 전에 새 데이터를 두 번 생성 불가합니다.  > setData( ) 메서드 두 번 실행 불가- 동일하게 소비자 스레드도 새로운 데[이터 생성 전에 데이터를 두 번 읽어서도 안됩니다.   > getData( ) 메서드 두 번 실행 불가 구현은 실제로 다음과 같이 진행합니다. 공유 객체(DataBox..
멀티 스레드(6) - 스레드 상태 제어 5 : 스레드 간 협업 2 앞선 아티클에서 스레드 간 협업을 위한 메서드의 기본적인 사용법을 알아보았습니다. 이번에는 예제를 통해서, 앞선 스레드 간 협업을 위한 메서드 사용을 구체적으로 살펴보겠습니다.      이번 예제에서 두 스레드인 ThreadA와 ThreadB의 작업을 살펴보겠습니다.- 공유객체인 WorkObject에서 두 스레드의 작업을 methodA( ) / methodB( )에 정의합니다.- 두 스레드 ThreadA와 ThreadB가 교대로 methodA( )와 methodB( )를 호출합니다.   // WorkObject.java// 두 스레드의 작업 내용을 동기화 메서드로 작성한 공유 객체public class WorkObject { public synchronized void methodA() { System..
멀티 스레드(6) - 스레드 상태 제어 5 : 스레드 간 협업 1 ○ 스레드 간 협업( wait( ), notify( ), notifyAll( ) ) 경우에 따라 두 개의 스레드를 번갈아 교대로 실행할 필요성이 생길때가 있습니다. 정확한 교대 규칙이 필요할 경우, 자신의 작업이 끝나면 상대방 스레드를 일시 정지 상태에서 풀고 - 자신은 일시 정지 상태로 만들면 됩니다.  여기서 wait( ) / notify( ) / notifyAll( )이 사용되는데, 설명이 복잡할 수 있으니 메서드 표를 다시 한번 인용해 보겠습니다.      동작메서드설명일시 정지 > 실행 대기interrupt( )일시 정지 상태의 스레드에서 InterruptedException 예외를 발생 시켜, 예외 처리 코드(catch)에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다.notify..
멀티 스레드(6) - 스레드 상태 제어 4 ○ 다른 스레드의 종료 기다리기( join( ) ) 스레드는 기본적으로 다른 스레드와 독립적으로 실행하는 것이 기본입니다. 하지만, 다른 스레드가 종료될 때까지 기다렸다가 실행해야 하는 경우도 발생할 수 있습니다. 예를 들어 하나의 스레드에서 계산 작업을 진행하고, 다른 스레드에서 이 결과값을 받는 경우가 있죠.  Thread는 이런 상황을 위해 join( ) 메서드를 제공합니다. 간단히 설명하자면, ThreadA에서 ThreadB를 실행하고, ThreadB의 join( )을 실행하면 ThreadA는 ThreadB가 종료될 때 까지 일시 정지 상태가 됩니다. ThreadB의 run( ) 메서드가 종료되어야 비로소 ThreadA는 다시 실행 상태가 됩니다.  ThreadA에서 threadB.start( )..
멀티 스레드(6) - 스레드 상태 제어 3 ○ 다른 스레드에게 실행 양보하기( yield( ) )  스레드 처리 작업은 반복적인 실행 상태 유지를 위하여 for문 또는 while문을 사용하는 경우가 많습니다. 그런데, 이러한 반복문이 무의미하게 반복이 유지되는 경우가 있습니다.  public void run() { while(true) { if(work) { System.out.println("ThreadA 작업 내용"); } }}  위와 같은 while문이 있다고 가정해 보겠습니다. 스레드가 실행되어 run( )이 실행되면, while(true) { } 블록은 무한 반복 실행이 됩니다.  그런데 이 때, work가 true가 아니라 false라면? 그리고 work가 false에서 true 바뀌는 상황이 정..
멀티 스레드(6) - 스레드 상태 제어 2 앞서 스레드 상태를 제어하는 메서드에 대해서 전반적으로 리뷰해 보았습니다. 이번 아티클부터는 해당 메서드를 하나씩 살펴보도록 하겠습니다.    멀티 스레드(6) - 스레드 상태 제어 1[스레드 상태 제어]라는 용어의 개념이 무엇인지부터 쉽게 설명해 보겠습니다. 우리가 미디어 플레이어로 동영상을 재생을 하다보면, 영상을 정지했다가 다시 재생하기도 하고 영상 재생을 종nozeroslope.tistory.com    ○ 주어진 시간동안 일시 정지( sleep( ) ) 기본적인 스레드 상태 제어 정적 메서드인 sleep( )입니다. Thread.sleep( ) 메서드를 호출한 스레드는 파라미터로 전달된 시간동안 일시 정지(TIME_WAITING) 상태가 되고, 다시 실행 대기 상태(RUNNABLE)로 돌아가게 ..
멀티 스레드(6) - 스레드 상태 제어 1 [스레드 상태 제어]라는 용어의 개념이 무엇인지부터 쉽게 설명해 보겠습니다. 우리가 미디어 플레이어로 동영상을 재생을 하다보면, 영상을 정지했다가 다시 재생하기도 하고 영상 재생을 종료하기도 합니다. 간단한 동작이지만 이는 '동영상 스레드'를 일시 정지하거나 종료 상태로 만들면서 실행 중인 스레드의 상태를 변경하게 됩니다.  위와 같이 실행 중인 스레드의 상태를 변경하는 것을 [스레드 상태 제어]라고 합니다. 이 스레드 상태 제어는 기본적인 스레드의 상태에 기반해 설명하기 때문에, 앞선 스레드 상태와 관련된 내용을 리뷰해 보시기 바랍니다.    멀티 스레드(5) - 스레드 상태 1스레드 상태에서부터는 내용이 다소 복잡해집니다. 스레드의 실행 과정은 간단해 보였지만(run 메서드 실행), 이 과정에서는 복..
멀티 스레드(5) - 스레드 상태 2 앞서서 스레드의 상태에 대한 열거 상수 리스트까지 살펴보았습니다. 이제 이 내용을 바탕으로, 예제 코드를 작성해 보겠습니다.    멀티 스레드(5) - 스레드 상태 1스레드 상태에서부터는 내용이 다소 복잡해집니다. 스레드의 실행 과정은 간단해 보였지만(run 메서드 실행), 이 과정에서는 복잡한 상태 변동이 일어나기 때문이죠. 차근차근 짚어나가 보겠습nozeroslope.tistory.com  아래의 스레드는 특정 타겟 스레드의 상태를 0.5초 주기로 출력하는 스레드입니다.// StatePrintThread.java// 타겟 스레드의 상태를 출력해주는 스레드public class StatePrintThread extends Thread { private Thread targetThread; // 파라미..