반원 블로그

[JAVA] 멀티스레드_2.작업스레드 생성과 실행 본문

2017/JAVA (기본)

[JAVA] 멀티스레드_2.작업스레드 생성과 실행

반원_SemiCircle 2017. 3. 9. 07:00

■1
멀티스레드로 실행하는 애플리케이션을 개발하려면 몇 개의 작업을 병렬로 실행할지 사전에 계획해야 한다.
예를 들면, 메인스레드:메신저 시작, 스레드1:채팅, 스레드2:파일전송 같이 설계할 수도 있다.



■2

자바에서 작업스레드도 객체로 생성되기 때문에 클래스가 필요하다.
java.lang.Thread 클래스를 직접 객체화해서 생성해도 되지만, Thread를 상송해서 하위 클래스를 만들어 생성도 가능하다.

■3 Thread 클래스로부터 직접 생성
java.lang.Thread 클래스로 작업스레드 객체를 직접 만드려면 Runnable을 매개값으로 갖는 생성자를 호출해야한다.

Thread thread = new Thread(Runnable target);

실행가능하다는 의미의 Runnable 은 작업 스레드가 '실행할 수 있는 코드를 가진 객체'라고 해서 붙여진 이름이다. Runaable은 인터페이스 타입이다. 따라서 구현 객체를 만들어 대입한다.


Runnable에는 메소드 run()이 정의되어있다. 구현클래스를 작성할 때는 run()을 재정의해서 작업스레드가 실행할 코드를 작성해야한다.
class Task implements Runnable{
	public void run(){
		//스레드가 실행할 코드
	}
}

오해하면 안되는 것이 'Runnable=실제스레드'가 아니다. Runnable은 작업 내용을 가지고 있는 객체이지 실제 스레드는 아니다.(마치 객체를 생성 전에 객체를 정의할 클래스를 작성할 때 이것이 실제 객체가 아닌 것처럼? 적절한 비유인지는 모르겠다.)

Runnable 구현 객체를 생성한 후, 이것을 매개값으로 Thread 생성자를 호출하면 작업스레드가 생성된다.

Runnable task = new Task();
Thread thread = new Thread(task);

이 두 줄보다는 많이 사용되는 다음 방법에 숙지하자. 

위에서 "구현클래스를 작성할 때는 run()을 재정의해서 작업스레드가 실행할 코드를 작성해야한다"라고 했었다. Runnable 익명 객체를 매개값으로 사용한 방법이다. 이 방법을 더 많이 쓴다.

Thread thread = new Thread(new Runnable(){
	public void run(){
		//스레드가 실행할 코드
	}
});

//위 매개값에 해당하는 코드만 따로보면 다음과 같다. 이는 익명 구현 객체이다.
new Runnable(){
	public void run(){
		//스레드가 실행할 코드
	}
}



■4

작업스레드는 생성되는 즉시 실행되지 않고, start()로 호출해야된다. start()가 호출되면 작업스레드는 매개값인 Runnable의 run()을 실행하며 자신의 작업을 처리한다. 이에 대해선 다음 그림으로 이해하자.

thread.start();


Comments