스레드 제어 - join

이정연·2023년 1월 18일

자바기초

목록 보기
5/25
  • 스레드 join 예제
public class ThreadExample {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName() + "start");

        SumThread sumThread = new SumThread();

        sumThread.setTo(10);

        sumThread.start();
        /*try {
            sumThread.join();
        } catch (Exception e) {   //이게있으면 먼저실행하고, 없으면 그냥 빠른순서대로 실행한다. 
        						만약 join이 없을때 sumThread가 복잡하다면 실행하는도중에 end가 먼저 프린트될것이다.

        }*/
        System.out.println(String.format("1부터 %d까지의 합 : %d", sumThread.getTo(), sumThread.getSum()));

        System.out.println(Thread.currentThread().getName() + "end");




    }
}

class SumThread extends Thread {
    private long sum;
    private int to;

    public long getSum() {
        return sum;
    }

    public int getTo() {
        return to;
    }

    public void setTo(int to) {
        this.to = to;
    }

    public void run() {
        try { Thread.sleep(1000); } catch (Exception error) {}

        for (int i = 1; i <= to; i++) {
            sum += i;
        }
        System.out.println(sum);
    }
}

처음에 맨아래 run()메서드에 있는 try { Thread.sleep(1000); } catch (Exception error) {}을 없이 진행했었다.
그랬더니 처리속도가 너무빨리서 원했던 결과가 안나왔다.(run()메서드가 복잡했으면 아마 원하는결과가 나왔을것이라 생각한다)
원했던 결과는
//
mainstart
1부터 10까지의 합 : 0
mainend
55
//
이어야 했다. 그래서 고의적으로 run()의 처리속도를 낮추기 위해
try { Thread.sleep(1000); } catch (Exception error) {}을 넣고 진행했다.

여기서 위의 주석과 같이 스레드를 우선하는 join()메서드를 집어넣었다.
그랬더니 sumThread가 실행될때가지 기다린다음에 mainend가 출력되는 것을 볼 수 있었다.
결과는
//
mainstart
55
1부터 10까지의 합 : 55
mainend
//
로 예상대로 출력되는것을 볼 수 있었다.

추가적으로 main이 종료되어도 스레드는 백그라운드에서 실행됨을 눈으로 확인할 수 있었다.

profile
반갑습니다.

0개의 댓글