본문 바로가기
My Image
프로그래밍/Java

[Java] multi thread 구현 01

by Lim-Ky 2017. 6. 29.
반응형

우선 멀티스레드가 필요한 경우는

 

 

 

다수의 작업을 병렬로 처리하기 위해서이다.

 

 

 

예를 들어...

 

 

 

메인스레드는 프로그램시작을 담당하고

 

작업스레드1은 네트워킹

 

작업스레드2는 드로잉을 처리를 해야하는 경우가 그렇다..

 

 

 

Java에서 멀티스레드를 구현하는 방법에 있어 2가지 방법이 존재한다.

 

 

 

1. java.lang.thread 클래스를 직접 객체화 해서 생성한다.

 

2. Thread를 상속해서 하위클래스를 만들어 생성한다.

 

 

 

우선 첫번째 java.lang.thread클래스를 직접 객체화해서 생성하는 방법을 알아보자.

 

 

 

1. java.lang.thread 클래스를 직접 객체화 해서 생성한다.

 

 

 

java.lang.Thread 클래스로부터 작업 스레드 객체를 직접 생성하려면, 다음과 같이 Runnable을 매개값으로 갖는 생성자를

 

호출해야한다. 

 

(참고로 인터페이스 naming을 할 때 끝을 ~able이라고 관용적으로 사용한다.)

 

 

 

Thread thread = new Thread(Runnable target); 과 같이..

 

 

 

Runnable은 작업 스레드가 실행될 수 있는 코드를 가지고 있는 개체라고해서 붙여진 이름이다.

 

Runnable은 인터페이스 타입이기 때문에 구현객체를 만들어 대입해야한다. 

 

Runnable에는 run() 메소드 하나가 정의되어 있는데, 구현클래스에서 run()을 재정의해서 즉 오버라이딩해서

 

작업스레드가 할 일들을 코드로 작성하면 된다!

 

우선 Main클래스에서 주 메인스레드가 돌고, Runnable을 상속받은 Task라는 클래스를 아래와 같이 둔다.

 

 

 

package MultiThreadImplement_01;

import javax.print.attribute.standard.PrinterMessageFromOperator;

public class Task implements Runnable{

	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i = 0 ; i <10; i++)
			System.out.println("thread_01 : " + i);
	
	}
	
}

 

 

우리가 만들 작업스레드에게 전달할 일을 담고 있는 Task클래스를 구현해보자.

 

위에서 설명 했듯이 Runnable이라는 인터페이스를 상속받은 후 run()메서드를 오버라이딩해서 

 

작업스레드에게 작업시킬 코드를 쓴다.

 

이제 작업시킬 일은 준비됬다.

 

package MultiThreadImplement_01;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		//방법 01 - 별도의 Runnable 인터페이스를 구현한 클래스를 만드는 방법
		//Runnable은 스레드가 실행할 작업내용을 가지고 있을 뿐. 실제 스레드는 아니다.
		//Runnable을 스레드 생성시 매개변수로 넘겨주어 thread 생성자를 호출한다.
			Runnable task = new Task();
			Thread thread_01 = new Thread(task);
			
			//start()메서드를 실행해야 비로소 스레드가 동작한다.
			thread_01.start();
			
			
		//방법 02 - Runnable 인터페이스를 익명 객체를 매개값으로 사용하는 경우.
			Thread thread_02 = new Thread(new Runnable() {
				
				@Override
				public void run() {
					// TODO Auto-generated method stub
					for(int i = 0 ; i <10; i++)
						System.out.println("thread_02 : " + i);
				}
			});
			//start()메서드를 호출해야 비로소 스레드 동작
			thread_02.start();
			
			//Java에서 기본적으로 제공되는 main thread() 테스트
			for(int i = 0 ; i <10; i++)
				System.out.println("MainThread() : " + i);
			
	}

}
다음 Task클래스의 인스턴스를 만들고 작업스레드를 생성할 때 매개변수로 Task인스턴스를 넘겨줌으로써 작업스레드 Thread_01이 
Task안에 오버라이딩 되어있는 run()메서드를 실행시킬 것이다.
주석에서도 알 수 있듯이 Thread는 start()메서드를 호출해줘야 비로소 실행된다.
 
방법02 를 보면 방법01과 같은 원리지만 다른점은 익명클래스를 이용하여 따로 클래스를 패키지 밖에 구현하지않고 
작업스레드 thread_02를 만드는 순간 매개변수로 run()메서드를 오버라이딩 시킨다. 
 
마지막으로 자바에서는 기본적으로 싱글스레드가 생성되서 돌아간다. mainThread라는 녀석인데 이녀석은 main()메서드를 실행시킨다.
main()스레드 마지막 코드 끝을 실행시키거나, return을 받았을 경우 종료된다. 
mainThread()가 기본적으로 동작하고 있음을 알기위해 마지막에 for()문을 돌려 MainThread() 를 println 하게 했다.
 
코드를 찬찬히 곱씹어보기 바란다.
 
 
결과는 다음과 같다.
 

 

Java에서 기본적으로 제공해주는 MainThread()와 우리가 만든 작업스레드 thread_01(),thread_01()이 찍혀 있음을 확인 할 수 있다. 

 

다음시간에는 두번째 멀티스레드 구현방법인....

 

작업스레드가 실행할 작업을 Runnable로 만들지 않고 Thread의 하위클래스로 작업스레드를 정의해서 구현하는 방법을 알아본다.

 

 

 

http://limkydev.tistory.com/53 - Thread 하위클래스로 구현하는 방법.

 

 

 

 

반응형

'프로그래밍 > Java' 카테고리의 다른 글

[Java] multiThread name - 스레드 이름  (0) 2017.07.02
[Java] multi thread 구현 02  (0) 2017.07.02
[Java] JVM 메모리 구조  (4) 2017.06.28
[Java] enum 이란?  (3) 2017.06.27
[Java] 멀티스레드 개념  (2) 2017.06.27

댓글