Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스프링 핵심 원리
- 인프런
- Exception
- SpringBoot
- Android
- jpa
- Servlet
- 스프링 핵심 기능
- pointcut
- Greedy
- Thymeleaf
- QueryDSL
- kotlin
- db
- spring
- transaction
- 자바
- JPQL
- 알고리즘
- JDBC
- springdatajpa
- http
- 그리디
- 스프링
- Spring Boot
- Proxy
- 김영한
- AOP
- 백준
- java
Archives
- Today
- Total
개발자되기 프로젝트
Thread 클래스의 메서드 본문
1. Thread 우선순위
- Thread.MIN_PRIORITY(=1)~Thread.MAX_PRIORITY(=10)
- 디폴트 우선순위: Thread.NORMAL_PRIORITY(=5)
- 우선 순위가 높은 Thread가 CPU의 배분을 받을 확률이 높음
- setPriority()/ getPriority()
- Thread 우선순위 예제
class PriorityThread extends Thread{
@Override
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 PriorityThreadTest {
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);
pt.start();
}
}
}
- 우선순위가 작은 것 부터 생성한다.
- start를 해도 생성된 대로 CPU 를 점유하는 것이 아니라, 우선순위가 반영되어 Thread가 CPU를 점유한다.
- start를 한다고 바로 thread가 실행되는 것은 아님ㅋㅋㅋ Runnable상태로 바뀌는건가?
- 물론 끝나는 것도 우선순위에 따라 달라진다.(우선순위가 절대적이지는 않다.)
- Thread0(우선순위 1)은 가장먼저 생성 되었지만 마지막에 끝났다 ㅋㅋㅋ
Thread[Thread-7,8,main] start
Thread[Thread-0,1,main] start
Thread[Thread-1,2,main] start
Thread[Thread-3,4,main] start
Thread[Thread-2,3,main] start
Thread[Thread-6,7,main] start
Thread[Thread-8,9,main] start
Thread[Thread-5,6,main] start
Thread[Thread-4,5,main] start
Thread[Thread-9,10,main] start
9end
6end
3end
10end
8end
7end
5end
4end
2end
1end
2. join()
- 동시에 두 개 이상의 Thread가 실행될 때 다른 Thread의 결과를 참조하여 실행해야 하는 경우 join()사용
- join()함수를 호출한 Thread가 not-runnable 상태로 됨.
- 왜냐? join할 thread가 끝나야 진행할 수 있기 때문
- 다른 thread의 수행이 끝나면 runnable 상태로 돌아옴
- 1부터 50, 51부터 100 까지의 합을 구하는 두 개의 Thread를 만들어 그 결과를 확인해보세요
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(){
for (int i=start; i<=end;i++){
total +=i;
}
}
public static void main(String[] args) {
JoinTest jt1 = new JoinTest(1, 50);
JoinTest jt2 = new JoinTest(51, 100);
jt1.start();
jt2.start();
//이 문장이 실행 될 시점에 jt1.total, jt2.total이 완료가 안됨.
//따라서 lastTotal = 0;
int lastTotal = jt1.total + jt2.total;
//이 문장이 실행될 때 jt1의 수행이 아직 안끝남.
System.out.println("jt1.total = " + jt1.total);
//이 문장이 실행될 때 jt2의 수행이 끝남.
System.out.println("jt2.total = " + jt2.total);
//위에서 0으로 초기화됨.
System.out.println("lastTotal = " + lastTotal);
}
}
- 실행 결과가 이상하다.? 자세한 이유는 위의 주석 확인..
jt1.total = 0
jt2.total = 3775
lastTotal = 0
- 현재 Thread는 3개이다.
- main, jt1, jt2
- 이 중 lastTotal 값이 필요한 Thread는 main Thread이다.
- 그러면 main Thread가 jt1, jt2의 결과가 필요한 것이다.
- 즉, main Threar가 jt1, jt2 수행이 종료될 때 까지 not-runnable상태에 들어가야 한다.
- 따라서 main Thread에서 jt1, jt2에 join을 걸어줘야 한다.
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(){
for (int i=start; i<=end;i++){
total +=i;
}
}
public static void main(String[] args){
JoinTest jt1 = new JoinTest(1, 50);
JoinTest jt2 = new JoinTest(51, 100);
jt1.start();
jt2.start();
//현재 main Thread가 돌아감. main Thread에서 jt1, jt2에 join걸기.
try {
jt1.join();
jt2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
int lastTotal = jt1.total + jt2.total;
System.out.println("jt1.total = " + jt1.total);
System.out.println("jt2.total = " + jt2.total);
System.out.println("lastTotal = " + lastTotal);
}
}
jt1.total = 1275
jt2.total = 3775
lastTotal = 5050
3. interrupt()
- 다른 Thread에 예외를 발생시키는 interrupt를 보낸다
- Thread가 join(), sleep(), wait()함수에 의해 not-runnable 상태일 경우, interrupt() 메서드를 호출하면
- 다시 runnable 상태가 될 수 있음.
- 따라서 join(), sleep(), wait()을 사용할 경우 InterruptException 처리를 해줘야 함.
4. Thread 종료하기
- Thread를 종료할 때 사용
- 무한 반복의 경우 while(flag)의 flag 변수 값을 false로 바꾸어 종료를 시킴
- Thread 종료 예제
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println( getName() + " end" );
}
public void setFlag(boolean flag){
this.flag = flag;
}
public static void main(String[] args) throws IOException {
TerminateThread threadA = new TerminateThread("A");
TerminateThread threadB = new TerminateThread("B");
TerminateThread threadC = new TerminateThread("C");
threadA.start();
threadB.start();
threadC.start();
int in;
while(true){
in = System.in.read();
if ( in == 'A'){
threadA.setFlag(true);
}else if(in == 'B'){
threadB.setFlag(true);
}else if( in == 'C'){
threadC.setFlag(true);
}else if( in == 'M'){
threadA.setFlag(true);
threadB.setFlag(true);
threadC.setFlag(true);
break;
}else{
System.out.println("type again");
}
}
System.out.println("main end");
}
}
5. GitHub : 211002 Thread, method
'Java > 다양한 기능' 카테고리의 다른 글
wait(), notify() 메서드 활용한 동기화 프로그래밍 (0) | 2021.11.03 |
---|---|
멀티 Thread 프로그래밍에서의 동기화 (0) | 2021.11.03 |
Thread (0) | 2021.11.01 |
Decorator Pattern 예제 (0) | 2021.11.01 |
여러가지 입출력 클래스 (0) | 2021.10.31 |
Comments