• [JAVA/자바] Runnable인터페이스로 스레드 만들기

    2023. 6. 6.

    by. 개발도비

    스레드 만들기 

    자바 스레드를 만들기 위해 개발자는 두 가지 작업을 해야 한다

    * 스레드 코드 작성

    * JVM에게 스레드를 생성하고 스레드 코드를 실행하도록 요청

     

    스레드 코드를 작성하는 방법은 

    1) Thread 클래스 이용 2) Runnable 인터페이스 이용

    이렇게 두 가지가 있는데 Runnable인터페이스를 이용하여 스레드를 만들어보도록 하자

     

    Runnable 인터페이스로 스레드 만들기 

    : Runnable은 클래스가 아닌 인터페이스로서 경로명 java.lang.Runnable이며, 다음과 같이 추상 메소드 run() 하나만 가지고 있다. 

     interface Runnable {
         public void run(); 
    }

     

    아래의 코드는 Runnable 인터페이스의 run()을 구현한 TimerRunner 클래스를 작성하고 스레드를 생성하는 코드이다. TimerRunnable 클래스는 1초 단위로 초 시간을 콘솔에 출력하는 스레드 코드를 구현한다

    Runnable 인터페이스의 run()메소드를 오버라이딩하여 스레드 코드를 작성한다. run()메소드는 스레드 코드이며 run()이 종료되면 스레드도 종료된다.

     

    Thread 객체를 생성한다. 이때 생성자에 TimerRunnable의 객체를 전달한다.

    Thread th = new Thread(new TimerRunnable());

    이 코드는 생성한 스레드 th의 스레드 코드로 TimerRunnable의 run()을 사용할 것을 알려준다. 

    마지막 과정으로 Thread 클래스의 start() 메소드를 호출하여 스레드를 시작하게 한다. th.start()는 생성된 스레드 객체 th를 스케줄링이 가능한 상태로 전환하도록 JVM에게 지시한다. 이후 JVM에 의해 이 스레드가 선택되면 이 스레드의 run() 메소드가 호출되고 실행된다. 

     

    Runnable 인터페이스를 상속받아 1초 단위로 초 시간을 출력하는 스레드 작성

     

    실행결과(무한루프)

     

     

    생성된 스레드에 관련된 여러 정보들은 다음과 같다

    필드 타입 내용
    스레드 이름 스트링 스레드 이름으로서 사용자가 지정
    스레드 ID 정수 스레드 고유의 식별자 번호
    스레드의 PC(Program Count)  정수 현재 실행 중인 스레드 코드의 주소
    스레드 상태 정수 NEW, RUNNABLE, WAITING, TIMED_WAITING, BLOCK, TERMINATED 등 6개 상태 중 하나
    스레드 우선순위 정수 스레드 스케줄링시 사용되는 우선순위 값으로서 1~10 사이의 값이며 10이 최상위 우선순위
    스레드 그룹 정수 여러 개의 자바 스레드가 하나의 그룹을 형성할 수 있으며 이 경우 스레드가 속한 그룹
    스레드 레지스터 스택 메모리 블록 스레드가 실행되는 동안 레지스터들의 값

     

    이 정보들은 JVM에 의해 관리되고 이들 대부분은 Thread 클래스의 주요 메소드를 통해 읽어낼 수 있다

    (Thread 클래스의 주요 메소드는 https://code0123.tistory.com/170

     

    [JAVA/자바] Thread 클래스를 상속받아 스레드 만들기

    스레드 만들기 자바 스레드를 만들기 위해 개발자는 두 가지 작업을 해야 한다 * 스레드 코드 작성 * JVM에게 스레드를 생성하고 스레드 코드를 실행하도록 요청 스레드 코드를 작성하는 방법은 1

    code0123.tistory.com

    여기 있는 도표를 참고할 것)

     

     

    참고) 데몬 스레드(daemon thread)와 사용자 스레드(user thread) 

    : 자바의 스레드는 두 가지 종류로 구분된다. 첫째는 데몬 스레드(daemon thread)인데 응용프로그램이 실행되는 동안 관리를 위해 존재하는 스레드로, 가비지 컬렉션 스레드(garbage collector)가 대표적이다. 둘째는 사용자 스레드(user thread)로서 응용프로그램에서 생성한 스레드이다. 위의 예제에서 만들어진 스레드가 사용자 스레드이다. main()메소드를 실행하는 main 스레드 역시 사용자 스레드이다. 사용자 스레드는 Thread 클래스의 setDaemon(true)을 호출하면 데몬 스레드로 바꿀 수 있다. 데몬 스레드가 사용자 스레드와 다른 점은, 데몬 스레드가 살아 있더라도 사용자 스레드가 모두 종료되면 JVM과 함께 응용프로그램도 종료된다는 점이다. 

    댓글