#### Thread ####
- 생각보다 Thread 범위가 광범위하다. 너무 많다. 일단 오늘 배운 것( Runnable & extends ) 두 가지를 포스팅!
### Extends Thread ###
* Thread 를 extends 한 클래스를 작성한다.
* run() 메소드를 오버라이딩하여 내용부를 삭정한다.
* main() 메소드를 내부에서 Thread 를 extends 한 클래스의 객체를 생성한다.
* 해당 객체의 start() 메서드를 호출
EX)
class Daniel1 extends Thread {
public void run() {
System.out.println("Thread Start");
for ( int i = 0; i < 10; i++ ) {
System.out.println(i);
}
}
}
public class Daniel1Main {
public static void main(String args[] ) {
Daniel1 danile1 = new Daniel1();
adniel1.start();
System.out.println("Thread End")
}
}
### Runnable Thread ###
* Runnable 을 구현하는 클래스 작성
* run() 메서드를 오버라이딩하여 내용을 구현
* main() 메서드에서 Runnable 를 구현한 클래스의 객체를 생성
* Thread 객체를 생성하여 매개변수를 implements Runnable 한 객체를 대입
* Thread 객체의 start() 메서드 호출
EX)
class Ssung1 implements Runnable {
public void run() {
System.out.println("Thread Start");
for ( int i = 0; i < 10; i++ ){
System.out.println(i);
}
}
}
public class Ssung1Main {
public void run() {
Ssung1 ssung1 = new Ssung1();
Thread ssung1Thd = new Thread(ssung1);
ssung1Thd.start();
}
}
- 허접하다. 쩝
- 2015.02.06 Thread 추가
▶ Thread 우선순위
- 동시에 여러 Thread 를 실행할 때 우선순위를 주어 실행시간을 늘려줄수 있다.
우선순위라고 해서 숫자가 낮은게 먼저라고 생각하겟지만, 그 반대이다.
쉽게, 실행시간을 늘려주기 위한 숫자라고 생각하면 될 듯 하다.
우선순위는 1 ~ 10 까지 정수이며, Default 값은 '5' 이다.
ThreadGroup 으로 상위 그룹의 우선순위를 설정한 후에 하위에 쓰레드를 추가하면 상위 ThreadGroup 에 설정한 우선순위를
따라간다.
그리고, Thread start() 하기전에 우선순위를 주어야 하며, start() 한 후에 우선순위를 주면 에러가 난다.
방법은, Thread.setPriority(int 우선순위 값) 안에 1 ~ 10 까지의 값을 넣어주면 된다.
▶ Daemon Thread (데몬 쓰레드)
- 데몬 쓰레드는 일반쓰레드의 작업을 돕는 보조적인 쓰레드
일반 쓰레드가 종료되면 자동으로 데몬 쓰레드는 종료가 된다.
무한루프나, 조건문을 이용해서 데몬 쓰레드 실행 후 대기하고 있다가 조건이 맞으면, 작업을 수행하고 다시 대기하는 쓰레드
데몬 쓰레드 작성 & 실행 방법은 일반 쓰레드와 거의 동일하다.
쓰레드 start() 전에 setDaemon(boolean on) 값에 'true' 지정하면 데몬 쓰레드가 된다.
주의할 점은 우선순위 설정과 같이 start() 하기전에 setDaemon(boolean on) 값을 입력하어야 한다.
- ex
public class Thread_Ex11 implements Runnable {
// 자동저장
static boolean autoSave = false;
public static void main(String[] args) {
Thread thread = new Thread(new Thread_Ex11());
thread.setDaemon(true);
thread.start();
for (int i = 1; i < 20; i++) {
try {
thread.sleep(1000);
} catch (Exception e) { }
System.out.println(i);
if( i == 5 ) {
autoSave = true;
}
}
System.out.println("프로그램을 종료합니다.");
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(3 * 1000); // 3초
} catch (Exception e) { }
// true 이면
if (autoSave) {
autoSave();
}
}
}
public void autoSave() {
System.out.println("작업파일이 자동저장 되었습니다.");
}
}
- main() 메서드 for 문이 종료되면 데몬 쓰레드는 자동으로 종료가 된다.
하지만, 데몬쓰레드 설정 setDaemon(boolean on) 값에 'true' 설정을 하지 않고 그냥 보통 쓰레드로 위 구문을 실행하면,
종료되지 않고.. 계속 "작업파일이 자동저장 되었습니다" 를 출력하게 될 것이다.(무한반복 '- ';;)
▶ 쓰레드 상태(JDK 1.5 부터 추가 됨)
- Thread.getState() 메서드 호출해서 확인 할 수 있다.
STATUS |
COMMENT |
NEW |
쓰레드가 생성되고 아직 START() 가 호출되지 않은 상태 |
RUNNABLE |
실행 중 또는 실행 가능한 상태 |
BLOCKED |
동기화블럭에 의해서 일시정지된 상태(LOCK 이 풀릴 때 까지 기다리는 상태) |
WAITING TIMED_WAITING |
쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은 일지정지 상태. TIMED_WAITING 은 일시정지시간이 지정된 경우를 의미 |
TERMINATED |
쓰레드의 작업이 종료된 상태 |
... 나중에 보면 또 다 까져먹을거 같은데..