Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

Thread 클래스의 메서드 본문

Java/다양한 기능

Thread 클래스의 메서드

Seung__ 2021. 11. 2. 23:52

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


 

GitHub - bsh6463/various_functions

Contribute to bsh6463/various_functions development by creating an account on GitHub.

github.com

 

'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