- CPU를 점유하고 있지 않은 상태
- start() 메소드 호출하면 run() 메소드가 수행되도록 내부적으로 동작하고 해당 쓰레드가 Runnable 상태로 진입한다.
- CPU를 점유하고 실행하는 상태
- run()은 JVM 만 호출 가능하며 스케줄러에 따라 Runnable의 쓰레드를 Running 상태로 진입한다.
- CPU 점유권 상실한 상태
- sleep(시간) 메소드는 시간이 지난 후 Runnable 상태로 바뀐다.
- wait() 메소드는 notify() 메소드가 호출되면 Runnable 상태로 바뀐다.
class ThreadEx extends Thread{
public void run() { //run() 메소드를 재정의 해야한다.
System.out.println("Thread Run");
}
}
public class ThreadTest {
public static void main(String[] args) {
ThreadEx threadEx = new ThreadEx();
threadEx.start(); //Thread Run
}
}
class ThreadEx extends Thread{
int num;
public ThreadEx(int num) {
this.num=num;
}
public void run() { //run() 메소드를 재정의 해야한다.
System.out.println(this.num+" Thread Run");
try {
Thread.sleep(2000); //2초 뒤 재실행
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.num+" Thread end");
}
}
public class ThreadTest {
public static void main(String[] args) {
for(int i = 0; i<10; i++) {
ThreadEx threadEx = new ThreadEx(i);
threadEx.start();
}
System.out.println("main end");
}
}
import java.util.ArrayList;
class ThreadEx extends Thread{
int num;
public ThreadEx(int num) {
this.num=num;
}
public void run() { //run() 메소드를 재정의 해야한다.
System.out.println(this.num+" Thread Run");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this.num+" Thread end");
}
}
public class ThreadTest {
public static void main(String[] args) {
ArrayList<ThreadEx> threads= new ArrayList<>();
for(int i=0; i<10; i++) {
ThreadEx threadEx = new ThreadEx(i);
threadEx.start();
threads.add(threadEx);
}
for(int j = 0; j<threads.size(); j++) {
ThreadEx thread= threads.get(j);
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("main end");
}
}
class ThreadImple implements Runnable{
public void run() { //run() 메소드를 재정의 해야한다.
System.out.println("Thread Run");
}
} //Runnable 인터페이스 구현
//Runnable을 구현한 객체는 run() 메소드에만 접근할 수 있다.
public class ThreadTest2 {
public static void main(String[] args) {
ThreadImple threadEx = new ThreadImple();
Thread threadImple= new Thread(threadEx);
//Thread 생성자에 넣어 사용
threadImple.start();
}
}
- 물론 Thread를 상속받는 방법이 조금 더 간단하지만 다중상속이 불가한 자바에서 Runnable 인터페이스을 구현한 객체를 이용하는 방법이 더 선호된다.
Reference: