quilt code

[고급자바] Thread (4) 본문

daily/고급자바

[고급자바] Thread (4)

김뱅쇼 2023. 2. 10. 18:42

1. Thread Yield

 

1) yield() 메소드


1. 현재 실행 대기중인 동등한 우선순위 이상의 다른 스레드에게 실행기회를 제공한다. (양보)


2. 현재 실행 중인 스레드의 상태를 RUNNABLE 상태로 바꾼다. (WAITING이나 BLOCKED가 아니라)


3. yield() 메소드를 실행한다고 해서 현재 실행 중인 스레드가 곧바로 RUNNABLE 상태로 전이된다고 확신할 수는 없다.

2) 예제

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
32
33
34
35
36
    public static void main(String[] args) {
        new YieldThread1().start();
        new YieldThread2().start();        
    }
 
}
 
class YieldThread1 extends Thread {
    public YieldThread1() {
        super("양보 스레드");
    }
    
    @Override
        public void run() {
            for(int i=0; i<10; i++) {
                System.out.println(Thread.currentThread().getName() + " : " + i);
                for(int j=0; j<1000000000; j++) {
            }
                Thread.yield();  //양보하기
        }
    }
}
 
class YieldThread2 extends Thread {
    public YieldThread2() {
        super("비양보 스레드");
    }
    
    @Override
        public void run() {
            for(int i=0; i<10; i++) {
                System.out.println(Thread.currentThread().getName() + " : " + i);
                for(int j=0; j<1000000000; j++) {
            }
        }
    }
cs

 

2. Thread Stop

 

Thread의 stop() 메소드를 호출하면 스레드가 바로 멈춘다.
이 때 사용하던 자원을 정리하지 못하고 프로그램이 종료되어서 나중에 실행되는 프로그램에 영향을 줄 수 있다.
그래서 현재는 비추천

 

1) stop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Thread th1 = new ThreadStop1();
        th1.start();
        
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        
        /*
         *   Thread의 stop() 메소드를 호출하면 스레드가 바로 멈춘다.
         *   이 때 사용하던 자원을 정리하지 못하고 프로그램이 종료되어서 나중에 실행되는 프로그램에 영향을 줄 수 있다.
         *   그래서 현재는 비추천으로 되어 있다.
         */    
         th1.stop();  // 비추천 메소드 
         ((ThreadStop1)th1).setStoped(true);
cs

 

 

1
2
3
4
5
6
7
try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        th2.interrupt();  // 인터럽트 걸기
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ThreadStop1 extends Thread {
    
    private boolean isStoped;
    
    
    public void setStoped(boolean isStoped) {
        this.isStoped = isStoped;
    }
 
 
    @Override
    public void run() {
        while(!isStoped) {
            System.out.println("스레드 처리 작업 중...");
        }
        System.out.println("자원정리 중...");
        System.out.println("실행 종료.");
    }
    
    
}
cs

 

2) interrupt() 메소드를 이용한 스레드 중지 방법

 

① 방법 1 : sleep() 메소드나 join() 메소드 등을 사용했을 때 interrupt() 메소드를 호출하면 InterruptedException이 발생한다. 이 예외를 이용하는 방법

 

1
2
3
4
5
6
7
8
9
10
11
12
@Override
    public void run() {
        
         
          try {
            while(true) {
                System.out.println("스레드 처리 작업 중...");
                Thread.sleep(1);
            }
        } catch(InterruptedException ex) {
            
         } 
cs

 

② 방법 2 : interrupt() 호출되었는지 검사하여 처리하기

 

      ㄱ. 검사방법 1 : 스레드의 인스턴스 메소드를 이요하는 방법

1
2
3
4
if(this.isInterrupted()) {
                System.out.println("인스턴스용 isInterrupted() 호출됨.");
                break;
}
cs

     

      ㄴ. 검사방법 2 : 스레드 클래스의 정적 메소드를 이용하는 방법

1
2
3
4
5
6
7
8
9
10
if(Thread.interrupted()) {
                System.out.println("정적 메소드 interrupted() 호출됨.");
                
                System.out.println("if절 안에서... : " + Thread.interrupted());
                break;
            }
        }
        
        System.out.println("자원정리 중...");
        System.out.println("실행 종료.");
cs

 

'daily > 고급자바' 카테고리의 다른 글

[고급자바] Thread(6)  (0) 2023.02.13
[고급자바] Thread(5)  (0) 2023.02.10
[고급자바] 컴퓨터와 가위바위보 프로그램  (0) 2023.02.07
[고급자바] Thread(3)  (0) 2023.02.07
[고급자바] Thread (2)  (0) 2023.02.07