-
스레드 만들기
자바 스레드를 만들기 위해 개발자는 두 가지 작업을 해야 한다
* 스레드 코드 작성
* JVM에게 스레드를 생성하고 스레드 코드를 실행하도록 요청
스레드 코드를 작성하는 방법은
1) Thread 클래스 이용 2) Runnable 인터페이스 이용
이렇게 두 가지가 있는데 Thread 클래스를 이용하여 작성해보도록 하자
Thread 클래스를 상속받아 스레드 만들기
: Thread 클래스의 경로명은 java.lang.Thread이다. Thread 클래스를 상속받아 개발자의 스레드 코드를 만들 수 있다. Thread 클래스는 스레드를 만들고 유지 관리하기 위해 많은 메소드를 제공한다.
Thread의 메소드 내용 Thread()
Thread(Runnable target)
Thread(String name)
Thread(Runnable target, String name)스레드 객체 생성.
Runnable 객체인 target을 이용하여 스레드 객체 생성.
이름이 name인 스레드 객체 생성.
Runnable 객체를 이용하며, 이름이 name인 스레드 객체 생성.void run() 스레드 코드로서 JVM에 의해 호출된다. 개발자는 반드시 이 메소드를 오버라이딩해서 스레드 코드를 작성해야 한다. 이 메소드가 종료되면 스레드도 종료된다. void start() JVM에게 스레드 실행을 시작하도록 요청 void interrupt() 스레드 강제 종료 static void yield() 다른 스레드에게 실행을 양보한다. 이때 JVM은 스레드 스케줄링을 시행하며 다른 스레드를 선택하여 실행시킨다 void join() 스레드가 종료할 때까지 기다린다 long getId() 스레드의 ID 값 리턴 String getName() 스레드의 이름 리턴 int getPriority() 스레드의 우선순위 값 리턴. 1에서 10 사이 값 void setPriority(int n) 스레드의 우선순위 값을 n으로 변경 Thread.State getState() 스레드의 상태 값 리턴 static void sleep(long mills) 스레드는 mills 시간 동안 잔다. mills의 단위는 밀리초 static Thread currentThread() 현재 실행중인 스레드 객체의 레퍼런스 리턴 Thread를 상속받아 스레드 코드를 작성해보자
run() 메소드에 작성된 코드를 스레드코드라고 부른다. 스레드는 run()에서부터 실행을 시작하고 run()이 종료하면 스레드도 종료한다. run()은 보통 메소드와 같은 방법으로 작성하면 된다.
스레드 코드 작성 : run() 메소드 오버라이딩 run()을 오버라이딩하지 않으면 Thread 클래스에 작성된 run()이 실행되며, 이 run()은 아무 일도 하지 않고 단순 리턴하도록 작성되어있어 스레드가 바로 종료된다.
스레드 객체 생성 스레드 객체를 생성한 것으로 스레드가 작동하는 것은 아니다. 스레드 객체의 생성은 그냥 하나의 객체 생성에 불과하다. 스레드는 다른 객체와는 달리 JVM에 등록되어 JVM에 의해 스케줄링이되어야 비로소 작동하는 것이다.
스레드 생성의 제일 중요한 마지막 과정은 스레드가 생명력을 가지고 실행을 시작하도록 하는 것이다. Thread 클래스의 start() 메소드를 호출하여 스레드를 동작시킨다.
start()메소드는 Thread 클래스에 구현된 메소드이며 개발자가 오버라이딩하면 안 된다. start()메소드는 생성된 스레드 객체를 스케줄링이 가능한 상태로 전환하도록 JVM에게 지시한다. 이후 스케줄링에 의해 이 스레드가 선택되면 비로소 JVM에 의해 run()메소드가 호출되어 실행을 시작한다.
Thread를 상속받아 1초 단위로 초 시간을 출력하는 TimerThread 스레드 작성 TimerThread는 Thread를 상속받은 클래스로서 run()을 오버라이딩하여 스레드 코드를 구현한다. run() 메소드는 무한 루프를 돌면서 1초 간격으로 콘솔에 초 시간을 출력한다.
sleep(1000); 코드는 TimerThread 스레드가 1000ms동안 잠을 자는 코드이다. 한 스레드가 잠을 자면 JVM은 다른 스레드를 실행시킨다. 스레드는 잠을 자는 사이에 발생하는 InterruptedException 예외를 처리할 try-catch 블록을 반드시 가지고 있어야 한다. try-catch블록이 없으면 컴파일 오류가 발생한다.
위의 코드에서 catch블록은 바로 return하므로 InterruptedException이 발생하면 run() 메소드가 종료하게 되어 스레드도 바로 종료한다.
실행결과 (무한루프) 'Programming > JAVA' 카테고리의 다른 글
[JAVA/자바] 스레드 생명 주기와 스케줄링 (0) 2023.06.06 [JAVA/자바] Runnable인터페이스로 스레드 만들기 (1) 2023.06.06 [JAVA/자바] 자바의 멀티스레딩 (1) 2023.06.06 [JAVA/자바] Optional<ProcessHandle> (0) 2023.06.04 [JAVA/자바] ProcessHandle (0) 2023.06.04 댓글