반응형
간단한 쓰레드를 하나 예시로 남겨두려고 한다.
Thread에서 run(); start(); 메서드 둘다 같은 기능을 하는것 같은데 뭐가 다를까 궁금할 수 있다.
초보들만...ㅎㅎ;;
여기서 궁금증을 해결하기위한 짧은 코드를 준비해 보았다.
먼저 start(); 로 Thread를 돌렸을때의 결과를 보고 run();으로 돌렸을때의 결과를 볼예정이다.
public class ThreadRunStartTest implements Runnable{
int[] timeList = new int[10];
public ThreadRunStartTest() {
for (int i = 0; i < timeList.length; i++) {
timeList[i] = i;
}
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < timeList.length; i++) {
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("@@name : "+Thread.currentThread().getName());
System.out.println("@@가즈아"+timeList[i]);
}
}
public static void main(String[] args) {
ThreadRunStartTest test = new ThreadRunStartTest();
Thread t = new Thread(test,"t Thread");
Thread t1 = new Thread(test,"t1 Thread");
t.start();
t1.start();
}
}
결과 :
@@name : t1 Thread
@@name : t Thread
@@가즈아0
@@가즈아0
@@name : t Thread
@@name : t1 Thread
@@가즈아1
@@가즈아1
@@name : t1 Thread
@@name : t Thread
@@가즈아2
@@가즈아2
@@name : t Thread
@@가즈아3
@@name : t1 Thread
@@가즈아3
@@name : t Thread
@@가즈아4
@@name : t1 Thread
@@가즈아4
@@name : t Thread
@@name : t1 Thread
@@가즈아5
@@가즈아5
@@name : t Thread
@@name : t1 Thread
@@가즈아6
@@가즈아6
@@name : t Thread
@@가즈아7
@@name : t1 Thread
@@가즈아7
@@name : t1 Thread
@@가즈아8
@@name : t Thread
@@가즈아8
@@name : t1 Thread
@@가즈아9
@@name : t Thread
@@가즈아9
자 현재의 Thread는 병렬로 처리된것을 볼수 있다. 가즈아! => start()메서드 사용
그럼 run()메서드도 똑같을까?
다시 run()메서드로 실행시켜보자.
public class ThreadRunStartTest implements Runnable{
int[] timeList = new int[10];
public ThreadRunStartTest() {
for (int i = 0; i < timeList.length; i++) {
timeList[i] = i;
}
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < timeList.length; i++) {
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
System.out.println("@@name : "+Thread.currentThread().getName());
System.out.println("@@가즈아"+timeList[i]);
}
}
public static void main(String[] args) {
ThreadRunStartTest test = new ThreadRunStartTest();
Thread t = new Thread(test,"t Thread");
Thread t1 = new Thread(test,"t1 Thread");
t.run();
t1.run();
}
}
결과 :
@@name : main
@@가즈아0
@@name : main
@@가즈아1
@@name : main
@@가즈아2
@@name : main
@@가즈아3
@@name : main
@@가즈아4
@@name : main
@@가즈아5
@@name : main
@@가즈아6
@@name : main
@@가즈아7
@@name : main
@@가즈아8
@@name : main
@@가즈아9
@@name : main
@@가즈아0
@@name : main
@@가즈아1
@@name : main
@@가즈아2
@@name : main
@@가즈아3
@@name : main
@@가즈아4
@@name : main
@@가즈아5
@@name : main
@@가즈아6
@@name : main
@@가즈아7
@@name : main
@@가즈아8
@@name : main
@@가즈아9
뭔가 이상하다고 생각할 수 있다.
run()메서드로 실행하게 되면 한개의 Thread가 실행되고 난뒤 다음 Thread가 실행되는것을 볼수 있다.
또한 main이라는 Thread name을 공통적으로 갖게되는데,
이유는
run()메소드는 새로운 쓰레드가 작업을 실행하는데 필요한 호출스택(공간)을 생성한 다음 run()을 호출해서 그 안(스택)에 run()이 저장된다.
즉, 쓰레드를 사용하기 위해 run()를 실행시키는 순간 쓰레드만의 독립적인 작업 공간인 호출스택이 만들어지고, 그 후에 호출 스택안에 각 실행하고자 하는 예를 들면 run()과 같은 메소드들이 저장된다.
호출 스택에 있는 내용들이 모두 수행하고 나면 쓰레드는 호출스택 공간과 함께 메모리 상에서 소멸된다.
결론 :
병렬처리를 하고싶다면. ? => start();
병렬처리를 안하고싶다면 ? => run();
각각의 차이를 알고 사용하자...!
반응형
'Java > Basic' 카테고리의 다른 글
[Java/Basic] Queue란 ? Stack이란? 사용법 및 기본개념 (0) | 2021.04.13 |
---|---|
[Java/Basic] Daemon Thread란? 백그라운드 실행데몬? (0) | 2021.04.13 |
[Java] Builder Pattern이란? 객체 생성 방법들 (0) | 2021.03.19 |
[Java-Basic] 재귀함수를 통해 팩토리얼 연습 (0) | 2021.02.15 |
[Java-Basic] String, StringBuffer, StringBuilder 속도 비교 및 차이점 (0) | 2021.02.15 |