Thread 우선순위
- Thread.MIN_PRIORITY (1) ~ Thread.MAX_PRIORITY (10)
- 우선순위 따로 설정해주지 않았을 때 default 우선순위는 Thread.NORM_PRIORITY (5)
- 우선 순위가 높은 쓰레드가 CPU의 배분을 먼저 받을 확률이 높음 (무조건은 아님)
예제 코드
PriorityTest.java
package ch21;
class PriorityThread extends Thread {
public void run() {
int sum = 0;
Thread t = Thread.currentThread();
System.out.println(t + "start");
for(int i = 0; i <= 1000000; i++) { // 연산 수행
sum += i;
}
System.out.println(t.getPriority() + "end");
}
}
public class PriorityTest {
public static void main(String[] args){
int i;
for(i = Thread.MIN_PRIORITY ; i <= Thread.MAX_PRIORITY ; i++ ) {
PriorityThread pt = new PriorityThread();
pt.setPriority(i); // 쓰레드에 우선순위(1~10 부여)
pt.start();
}
}
join() 메서드
- 동시에 두개 이상의 쓰레드가 실행될 때 다른 쓰레드의 결과를 참조하여 실행해야 하는 경우 호출
- join() 함수를 호출한 쓰레드가 not runnable 상태가 됨
- 다른 쓰레드의 수행이 끝나면 runnable 상태로 돌아옴
- 쓰레드가 join(), sleep(), wait() 메서드에 의해 not runnable 상태일 때 interrupt() 메서드를 호출하면 interrupt exception을 발생시키고 runnable 상태가 됨
예제 코드
두 쓰레드를 생성하여 하나의 쓰레드에서는 1~50의 숫자를 더하고, 다른 쓰레드에서는 51~100을 더하는 연산을 수행한다.
join() 메서드를 호출하지 않았을 때
- 쓰레드가 연산 진행 중에 변수에 값이 저장됨
- 출력문은 쓰레드 종료 후 수행
package ch21;
public class JoinTest extends Thread{
int start;
int end;
int total;
public JoinTest(int start, int end) {
this.start = start;
this.end = end;
}
public void run() {
int i;
for (i = start; i <= end ; i ++ ) {
total += i;
}
}
public static void main(String[] args) {
int sum = 0;
JoinTest jt1 = new JoinTest(1,50);
JoinTest jt2 = new JoinTest(51,100);
jt1.start();
jt2.start();
int lastTotal = jt1.total + jt2.total; // 쓰레드가 종료하지 않은 상태에서 실행
System.out.println("jt1.total= " + jt1.total); // 쓰레드 끝나고 실행
System.out.println("jt2.total= " + jt2.total);
System.out.println("last total= " + lastTotal);
}
}
수행 결과
- 수행할 때마다 다른 결과 출력됨
jt1.total= 1275
jt2.total= 3775
last total= 0
join 메서드 추가
- main 쓰레드에서 jt1과 jt2의 join() 메서드를 호출
- main 쓰레드는 jt1과 jt2가 종료될 때까지 기다림
- lastTotal은 main 쓰레드가 취하는 값으로 두 쓰레드가 종료된 후 저장됨
- 만약 jt1, jt2가 끝나지 않으면 InterruptedException을 발생시켜 catch문을 실행하게 됨
...
jt1.start();
jt2.start();
try {
jt1.join();
jt2.join();
} catch (InterruptedException e) { // interrupt Exception 예외 처리
e.printStackTrace();
}
int lastTotal = jt1.total + jt2.total;
...
쓰레드 종료 예제 코드
세 개의 thread를 만든다.
각각 무한 루프를 수행하게 한다.
작업 내용 this.sleep(100);
‘A’ 를 입력 받으면 첫 번째 thread를
‘B’ 를 입력 받으면 두 번째 thread를
‘C’ 를 입력 받으면 세 번째 thread를
‘M’을 입력 받으면 모든 thread와 main() 함수를 종료한다.
TerminateThread.java
- 무한 루프의 경우 while(flag)에서 flag 값을 false로 변경하여 종료시킴
package ch21;
import java.io.IOException;
public class TerminateThread extends Thread{
private boolean flag = false;
int i;
public TerminateThread(String name) {
super(name);
}
public void run() {
while(!flag) { // 무한 루프
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(getName() + " end");
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public static void main(String[] args) throws IOException {
TerminateThread th1 = new TerminateThread("A"); // String 값 매개변수는 쓰레드의 이름
TerminateThread th2 = new TerminateThread("B");
TerminateThread th3 = new TerminateThread("C");
th1.start();
th2.start();
th3.start();
System.out.println("종료할 Thread의 이름을 입력하세요.");
int in;
while(true){
in = System.in.read();
if ( in == 'A'){
th1.setFlag(true);
}else if(in == 'B'){
th2.setFlag(true);
}else if( in == 'C'){
th3.setFlag(true);
}else if( in == 'M'){
th1.setFlag(true);
th2.setFlag(true);
th3.setFlag(true);
break;
}
}
System.out.println("main end");
}
}
수행 결과
'Java & Kotlin' 카테고리의 다른 글
[Java 기능] 동기화 구현 (1) - 리소스 하나를 공유하는 경우 (0) | 2022.02.18 |
---|---|
[Java 기능] 쓰레드(Thread) (0) | 2022.02.18 |
[Java 기능] Decorator Pattern 활용한 커피머신 프로그램 (0) | 2022.02.17 |