스레드는 시분할 방식으로 CPU의 시간을 분배하여 실행하지만 사용자가 직접 스레드의 우선순위를 지정해서 특정 스레드에 더 많은 실행시간 부여 가능
<우선순위 지정 메서드>
1. void setPriority(int new Priority) : 우선 순위 지정
2. int getPriority(): 우선 순위 반환
스레드 우선순위 보는 코드
public static void main(String[] args) {
Runnable t = new MyThread3(); // 업캐스팅
Thread t1 = new Thread(t,"thread1"); // new Thread (Runnable target, String name)
t1.setPriority(1);;//우선순위 1로 지정
System.out.println("t1의 우선순위는: "+t1.getPriority());
Thread t2=new Thread(t, "thread2");
//우선순위 지정x -> 우선순위:5
System.out.println("t2의 우선순위는: "+ t2.getPriority());
Thread t3=new Thread(t,"thread3");
t3.setPriority(10); //우선순위 10으로 지정
System.out.println("t3의 우선순위는 " +t3.getPriority());
t1.start();
t2.start();
t3.start();
}
}
class MyThread3 implements Runnable{
@Override
public void run() {
for(int i=0;i<5;i++) {
System.out.println("<"+Thread.currentThread().getName()+">");
}
for(int i=0;9<1000;i++) {} // 시간 지연
}
}
스레드는 현재 상태에 따라 네 가지 상태로 분류할 수 있으며, 상태가 변화하는 주기를 Life Cycle이라고 한다.
new
스레드가 키워드 new를 통해서 인스턴스화된 상태
Runnable이 될 수 있는 상태이며 아직 대기열에 올라가지 못한 상태
Runnable
start()메서드가 호출되면 new 상태에서 Runnable 상태가 된다.
Runnable 상태가 되면 실행할 수 있는 상태로 대기하게 되며 스케줄러에 의해 선택되면 run() 메서드를 바로 수행
Blocked
실행 중인 스레드가 sleep(), join() 메서드를 호출하게 되면, Blocked 상태가 된다.
Blocked 상태가 되면 스케줄러에 의해서 선택받을 수 없다.
* sleep() : 스레드를 지정한 시간동안 block상태로 만든다.(시간은 1000분의 1초까지 지정 가능)
* yield() : 자신의 시간을 양보하는 메서드. 스레드가 작업을 수행하던 중 yield()를 만나면, 자신에게 할당된 시간을 다음 차례 스레드에게 양도
* join() : 특정한 스레드가 작업을 먼저 수행할 때 사용하며, 실행 순서를 지켜야하는 스레드들을 제어한다.
Dead
run() 메서드의 실행을 모두 완료하게 되면 스레드는 Dead 상태가 된다.
할당받은 메모리와 정보 모두 삭제된다.
yield 예제
public static void main(String[] args) {
MyThread6 s1 = new MyThread6();
MyThread7 s2 = new MyThread7();
Thread t1 = new Thread(s1);
Thread t2 = new Thread(s2);
t1.start();
t2.start();
}
}
class MyThread6 implements Runnable{
@Override
public void run() {
for(int i =0;i<30;i++) {
System.out.print("★");
Thread.yield();
}
}
}
class MyThread7 implements Runnable{
@Override
public void run() {
for(int i =0;i<30;i++) {
System.out.print("☆");
}
}
}
join 예제
public static void main(String[] args) {
MyThread8 s1 = new MyThread8();
MyThread9 s2=new MyThread9();
Thread t1 = new Thread(s1);
Thread t2 = new Thread(s2);
t1.start();
try {
t1.join(); //t1을 제외한 나머지 스레드 block
}catch(InterruptedException ie) {System.out.println(ie.toString());}
t2.start();
try {
t2.join(); //t2를 제외한 나머지 스레드 block
}
catch(InterruptedException ie) {System.out.println(ie.toString());}
for(int i=0;i<10;i++) {
System.out.println("메인스레드:"+i);
}
}
}
class MyThread8 implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++) {
System.out.println("t1:"+i);
}
System.out.println("<<t1완료>>");
}
}
class MyThread9 implements Runnable{
@Override
public void run() {
for(int i=0;i<10;i++) {
System.out.println("t2:"+i);
}
System.out.println("<<t2완료>>");
}
}