본문 바로가기

전체 글

(686)
멀티 스레드(7) - 데몬 스레드 2 앞서 살펴본 데몬 스레드를 확인해볼 수 있는 예제를 살펴보도록 하겠습니다. 아래의 예제는 1초 주기로 save( ) 메서드가 자동 호출되도록 AutoSaveThread를 작성하고, 메인 스레드가 3초 후 종료되면 AutoSaveThread도 같이 종료될 수 있도록 AutoSaveThread를 데몬 스레드로 만들었습니다.  // 1초 주기로 save() 메서드를 호출하는 데몬 스레드public class AutoSaveThread extends Thread { public void save() { System.out.println("작업 내용 저장"); } @Override public void run() { while(true) { try { Thread.sleep(1000); } ca..
멀티 스레드(7) - 데몬 스레드 1 데몬(daemon) 스레드는, 주 스레드의 작업을 돕는 보저 역할을 수행하는 스레드입니다. 사실 이 데몬 스레드 자체의 속성은 일반 스레드와 아주 크게 다르지는 않은데, 주 스레드가 종료되면 강제로 종료된다는 특성을 갖습니다. 말했듯이 주 스레드의 보조 역할을 하는 것이 근본적인 존재 이유이기 때문에, 주 스레드가 종료되면 남아있을 이유가 없는 것이죠. 데몬 스레드가 동작하는 실제 예시를 보면, 워드프로세서의 자도 ㅇ저장 / 미디어 플레이어의 동영상(음악) 재생 / 가비지 컬렉터 등이 있습니다. 이들은 주 스레드(워드, 미디어 플레이어, JVM)가 종료되면 같이 종료됩니다.       스레드를 데몬으로 만들기 위해서는, 주 스레드가 데몬이 될 스레드의 setDaemon(true)를 호출해야 합니다. 아래..
멀티 스레드(6) - 스레드 상태 제어 6 : 스레드의 안전한 종료 2 ○ interrupt( ) 메서드를 이용하는 방법 이번에는 interrupt( ) 메서드를 사용해 스레드를 종료하는 방법을 살펴보겠습니다. 우선 interrupt( )의 사용 방법을 요약하면, 이 interrupt( ) 메서드는 어떤 메서드가 일시 정지 상태에 있을 때 InterruptedException 예외를 발생시키고, 이를 통해 run( ) 메서드를 종료시키는 역할을 하게 됩니다.  예를 들어, ThreadA에서 ThreadB의 인스턴스를 생성하고 threadB.start( )를 실행하면 ThreadB에서 run( )이 실행됩니다. 그러다가 ThreadB의 run( ) 메서드 내의 while문 안에서 Thread.sleep(1)이 실행되는 순간 일시정지 상태가 되고, 이 때  ThreadA에서는 ..
멀티 스레드(6) - 스레드 상태 제어 6 : 스레드의 안전한 종료 1 지금까지 살펴온 내용을 바탕으로 본다면, 스레드는 기본적으로 run( ) 메서드가 모두 실행되고 나면 자동으로 종료하게 되어 있습니다. 하지만, 경우에 따라 run( ) 메서드가 다 실행되지 않았어도 스레드를 즉시 종료할 필요성이 생기기도 합니다(영상 재생이 안 끝났는데 사용자가 중단하는 경우와 같이). 원래 Thread에서는 이런 즉시 종료를 위한 stop( ) 메서드가 제공되었었는데, 현재는 불안정성으로 인해 deprecated 되었습니다. 이를 제외한 스레드 즉시 중단 방법에 대해서 살펴보겠습니다.   ○ stop 플래그 사용하기 스레드는 run( ) 메서드가 끝남과 동시에 자동으로 종료되므로, run( ) 메서드의 종료를 유도하는 것이 최선입니다. 이 때, stop이라는 플래그를 ㅇ이용해서 run..
멀티 스레드(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( )..