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이 종료되어도 스레드는 백그라운드에서 실행됨을 눈으로 확인할 수 있었다.