자바 스레드를 만드는 방법은 2가지가 있다.
1) Thread 클래스 이용
2) Runnable 인터페이스 이용
Thread 클래스로 스레드 만들기
Thread 클래스의 경로명은 java.lang.Thread이며, Thread 클래스를 상속받아 새로운 스레드 코드를 만든다.
Thread 클래스는 스레드를 만들고 유지 관리하기 위해 많은 메소드를 제공한다.
- Thread() : 스레드 객체 생성
- Thread( Runnable target ) : Runnable 객체인 target을 이용하여 스레드객체 생성
- Thread( String name ) : 이름이 name인 스레드 객체 생성
- Thread( Runnable target, String 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() : 스레드의 우선순위 값을 n으로 변경
- Thread.State getState() : 스레드의 상태 값 리턴 > 실행되는지, 종료됐는지
- static void sleep(long mills) : 스레드는 mills 시간동안대기한다. mills의 단위는 ms (1000ms = 1초)
- static Thread currentThread() : 현재 실행 중인 스레드 객체의 레퍼런스 리턴
지금부터 Thread 클래스를 이용해서 1초단위로 초를 출력하는 타이머 스레드를 만들어보자.
- Thread 클래스를상속받아 run() 오버라이딩
: 자바에서는 스레드가 수행할 작업 코드를 반드시 run() 메소드에 작성하도록 한다. JVM이 스레드를 실행시키면, 스레드는 run() 메소드에서부터 실행을 시작한다. 그리고 run()이 종료하면 스레드도 종료한다. 그러므로 run()을 스레드 코드라고 부른다. 만일 run()을 오버라이딩하지 않으면 Thread 클래스에 이미 작성된 run()이 실행되는데, 이것은 아무 작업 없이 단순 리턴하도록 작성되어 있어 스레드는 바로 종료된다.
- 스레드 객체 생성
: 스레드 객체를 생성한다. TimerThread th = new TimerThread(); // TimerThread 객체를 생성한 것으로 스레드가 작동하는 것은 아니다. 스레드 객체 th에게 스레드로서 실행을 시작하도록 하려면 , 다음 단계인 start()를 호출해야 한다.
- 스레드 시작 : start() 메소드 호출
: 이제 Thread 클래스의 start()를 호출하여 JVM이 스레드 th를 스케줄링하도록 한다 ( th.start(); ). 그러면 th.run()이 실행된다. start() 메소드는 Thread 클래스에 구현되어 있는 메소드로서, 스레드 객체 th를 JVM에게 새로운 스레드로 인식하고 스케줄링 가능한 상태로 만들 것을 지시한다. 그러고 나서 JVM이 이 스레드를 스케줄링하면, 그때 비로소 스레드 th의 run()이 실행된다. start() 메소드는 개발자가 절대로 오버라이딩하면 안된다.
sleep(1000); 코드는 TimeThread 스레드가 1000ms 동안 대기하는 코드이다. 이 스레드를 종료시키고자 하는 예외 InterruptedException이 발생할 때 이를 처리하기 위해 try-catch블록이 삽입되어야 한다. 현재 catch 블록에서 바로 return하므로 InterruptedException 이 발생하면 run() 메소드가 종료하게 되어 스레드는 바로 종료한다. try-catch 블록 없이 sleep()문을 사용하면 컴파일러가 오류를 발생시킨다.
Runnable 인터페이스로 스레드 만들기
두 번째 방법으로 Runnable 인터페이스를 이용하여 스레드를 만들수 있다. Runnable은 경로명 java.lang.Runnable이며, 추상메소드 run()만 가진 인터페이스이다.
- 스레드 클래스 선언 : Runnable 인터페이스 구현
: implements Runnable로 구현하고, run() 메소드에 스레드 코드를 구현한다. run()이 종료되면 스레드도 종료된다
- 스레드 객체 생성
: run()을 오버라이딩한 TimerRunnable의 인스턴스를 생성하고, 다음과 같이 Thread 클래스의 생성자에 전달하면서 스레드 객체를 생성한다. Thread th = new Thread(new TimerRunnable()); 이제 스레드 객체 th는 사용자가 작성한 run() 메소드를 가지고 있는 것이다.
- 스레드 시작 : start() 메소드 호출
: 스레드의 생성의 마지막 과정으로 스레드를 실행시키는 과정이다. Thread 클래스의 start() 메소드를 호출하여 스레드 th가 run() 메소드에서 실행을 시작하도록 지시한다. th.start();
main 스레드
JVM은 자바 응용프로그램을 실행하기 직전, 스레드를 하나 생성하고, 이 스레드로 하여금 main() 메소드를 실행하도록 한다. 이 스레드가 바로 메인스레드(main스레드) 이고 실행 시작 주소는 main() 메소드의 첫 코드가 된다. main()을 실행하는 스레드를 확인하기 위해 Thread의 currentThread() 메소드를 이용하여 현재 실행되고 있는 스레드에 관한 정보를 담은 객체를 알아낼 수 있다.
'JAVA > 자바 스레드 기초' 카테고리의 다른 글
04. 스레드 동기화 (0) | 2024.03.13 |
---|---|
03. 스레드 종료 (0) | 2024.03.13 |
01. 멀티태스킹 (0) | 2024.03.13 |