본문 바로가기

Programming/JAVA

(139)
멀티 스레드(8) - 스레드 그룹 4 앞선 아티클에서 우리는 스레드 그룹 생성 기능을 살펴보았습니다.    멀티 스레드(8) - 스레드 그룹 3스레드 그룹을 명시적으로 선언하는 방법도 있습니다. ThreadGroup 생성자를 이용해서 객체를 생성하는 방식입니다. 이 때 생성자에서 ThreadGroup의 이름만 파라미터로 줄 수 있고, 부모 ThreadGroup과nozeroslope.tistory.com  당연한 의문인데, 이러한 스레드 그룹을 사용했을 때의 장점은 무엇이 있을까요? '그룹'으로 묶여있으니, 당연한 이야기지만 그룹을 일괄적으로 컨트롤이 가능하다는 장점이 있겠죠.  대표적인 예시가 interrupt( )입니다. ThreadGroup에서 제공하는 interrupt( ) 메서드를 사용하면, 그룹 내에 포함된 모든 스레드들을 일괄적으..
멀티 스레드(8) - 스레드 그룹 3 스레드 그룹을 명시적으로 선언하는 방법도 있습니다. ThreadGroup 생성자를 이용해서 객체를 생성하는 방식입니다. 이 때 생성자에서 ThreadGroup의 이름만 파라미터로 줄 수 있고, 부모 ThreadGroup과 이름까지 함께 파라미터로 전달이 가능합니다.  ThreadGroup tg = new ThreadGroup(String name);ThreadGroup tg = new ThreadGroup(ThreadGroup parent, String name); 두 번째 생성자처럼 스레드 그룹 생성 시에 부모(parent) 스레드 그룹을 별도로 지정하지 않을 경우, 현재 스레드가 속한 그룹의 하위 그룹으로 생성됩니다. 만일 main 스레드가 ThreadGroup(String name)을 이용해서 새로..
멀티 스레드(8) - 스레드 그룹 2 앞서 살펴본 스레드 그룹 사용 예제를 살펴보도록 하겠습니다.  // 1초 주기로 save() 메서드를 호출하는 데몬 스레드public class AutoSaveThread extends Thread { public void save() { System.out.println("작업 내용 저장"); } @Override public void run() { while(true) { try { Thread.sleep(1000); } catch (InterruptedException e) { break; } save(); } }}  import java.awt.Toolkit;import java.util.Map;import java.util.Set;public class Examp..
멀티 스레드(8) - 스레드 그룹 1 스레드 그룹(ThreadGroup)은 관련된 스레드를 일괄적으로 묶어서 관리할 목적으로 사용됩니다. 기본적으로 JVM이 실행되면 system 스레드 그룹을 만들게되고, JVM 운영에 필요한 스레드들을 system 스레드 그룹에 포함하게 됩니다.  그리고 system의 하위 스레드 그룹으로서 main 스레드 그룹이 생성됩니다. 그리고 '메인 스레드'를 이 main 스레드 그룹에 포함하게 됩니다.  기본적으로 스레드는 반드시 하나의 스레드 그룹에 포함되어야 합니다. 그런데 명시적으로 특정 스레드 그룹에 할당하지 않으면, 기본적으로는 자신을 생성한 스레드와 같은 스레드 그룹에 속하게 됩니다. 우리가 지금까지 생성한 작업 스레드는 대부분 main 스레드가 생성합니다. 그래서 결국 이들은 기본적으로 main 스레..
멀티 스레드(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..