본문 바로가기
JAVA/[JAVA] 바구니

[JAVA] Java Thread

by oncerun 2020. 3. 12.
반응형

1. 프로세스(PROCESS)

프로세스란 우리가 프로그래밍 언어로 절차를 작성해서 그 프로그램을 실행시켜서 동작하게 만들면

이것을 프로세스라고 합니다. 보통 프로세스는 하나의 프로그램 처리 경로를 가지고 있습니다.

이 경로는 직렬적인데 어떠한 일을 수행하는 것에 있어 프로그래머가 원하는 순서대로 작동을 합니다.

그러나 비동기 실행 병렬적으로 실행을 하고 싶을 때 자바에서 사용할 수 있는 것이 스레드 Thread입니다.

 

자바 스레드를 이용하면 여러 개의 처리 루틴을 가질 수 있습니다. 단순 반복의 코드를 실행할 때도

여러 개의 스레드를 만들어 분리시킨 뒤 결과를 받아 데이터를 합치게 되면 시간을 절약할 수 있습니다.

 

자바 쓰레드를 만들어서 구동하는 대표적인 방법은 Thread 클래스를 상속받는 것입니다.

ThreadTest클래스가 Thread 클래스를 상속했다.
Thread클래스의 run()을 구현하면 위와 같이
test.start() 실행 시 test객체의 run() 메서드가 실행된다.

스레드 동작을 확인하기 위해 다음 예제를 보자.

public class ThreadTest  extends Thread{
	 private static int num;
	  
	public  ThreadTest (int num) {
		this.num = num;
	}
	
	public void run() {
		System.out.println(this.num + "thread start.");
		try {
			Thread.sleep(1000);
		}catch(Exception e) {
			
		}
		System.out.println(this.num+ "thread end.");
		}
	
	
	public static void main(String[] args) {
		for(int i =0; i<10; i++) {
			ThreadTest test = new ThreadTest(i);
			test.start();
		}
		System.out.println("main end.");
	}

}

총 10개의 스레드를 실행시키는 예제이다. 어떤 스레드인지 확인하기 위해서 스레드마다 생성자에 순번을 부여했다. 그리고 스레드 메서드(run) 수행 시 시작과 종료를 출력하게 했고 시작과 종료 사이에 1초의 간격이 생기도록(Thread.sleep(1000)) 작성했다.

그리고 main 메소드 종료 시 "main end."를 출력하도록 했다.

 

결과는 다음과 같다

1 thread start.
2 thread start.
6 thread start.
6 thread start.
8 thread start.
main end.
9 thread start.
9 thread start.
9 thread start.
9 thread start.
9 thread start.
9 thread end.
9 thread end.
9 thread end.
9 thread end.
9 thread end.
9 thread end.
9 thread end.
9 thread end.
9 thread end.
9 thread end.

 

0번 스레드부터 9번 스레드까지 순서대로 실행이 되지 않고 그 순서가 일정치 않은 것을 보면 스레드는 순서에 상관없이 동시에 실행된다는 사실을 알 수 있다. 더욱 재밌는 사실은 스레드가 종료되기 전에 main 메서드가 종료되었다는 사실이다. main 메서드 종료 시 "main end."라는 문자열이 출력되는데 위 결과를 보면 중간쯤에 출력되어 있다.

 

그럼 모든 쓰레드가 종료된 뒤 main메서드가 종료되도록 하려면?

join메서드를 사용하면 된다.

스레드의 join 메서드는 스레드가 종료될 때까지 기다리게 하는 메서드이다.

쓰레드스레드 프로그래밍 시 가장 많이 실수하는 부분이 바로 스레드가 종료되지 않았는데 스레드가 종료된 줄 알고 그다음 로직을 수행하게 만드는 일이다. 스레드가 종료된 후 그다음 로직을 수행해야 할 때 꼭 필요한 것이 바로 이 join 메서드입니다.

반응형

'JAVA > [JAVA] 바구니' 카테고리의 다른 글

[JAVA] 유효범위  (0) 2020.04.02
[JAVA] SOLID 객체지향설계  (0) 2020.03.25
JAVA GUI  (0) 2020.03.11
[JAVA] 기본 타입과 참조타입  (0) 2020.03.10
클래스로부터 객체 생성  (0) 2020.03.09

댓글