[Java] Thread를 선언(생성) 하는 방법 알아보기.

2021-02-09


스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다. (출처 : 위키피디아 )

 

즉 기존의 싱글 스레드가 아닌 멀티스레드를 사용하기 위해서 이와 같이 따로 스레드를 만들어주어야 하는데, 오늘은 그 방법을 알아보자.


  • 방법 1.람다식으로 Runnable 구현하기

package Thread;

public class main {

	public static void main(String[] args) {

		Thread thread1 = new Thread(()-> {
			for(int i = 0; i < 5; i++) {
				System.out.println("Thread1 이 실행중입니다.");
			}

		});	
		
		// Thread(() -> { . . . } ); 은 람다식으로써
		// Thread(new Runnable(){ public void run(){ . . . } }); 
        	// 과 같은 동작을 한다.
		// Thread Runnable 객체를 구현해야지 동작된다.
		Thread thread2 = new Thread(()-> {
			for(int i = 0; i < 5; i++) {
				System.out.println("Thread2 이 실행중입니다.");
			}

		});	
        
		thread1.start();
		thread2.start();
	}
}
  
     

 

람다식이 들어가 다소 난해해 보일 수 있어 주석으로 해당 람다식을 풀어서 적어 두었다. 이의 코드와 같이 Runnable 객체를 구현해야 Thread를 사용할 수 있다. 해당 코드는 Ruunable의 run 메서드를 반복문을 통해 현재 실행 중이 Thread가 무엇인지 알려줄 수 있도록 했다. 실행 결과는 아래와 같다. 

결과물을 보면 번갈아 가며 thread가 실행되는 것을 확인 할 수 있다. ( 컴퓨의 성능이나 현재 상태에 따라 결과는 매번 달라진다.)


  • 방법 2. Thread를 상속받은 클래스 

package Thread;

public class Hello extends Thread{
	// Runnable 객체를 생성하지 않고
	// 클래스 자체에 Thread를 상속받은 후
	// thread의 run을 오버라이딩 하면 해당 스레드를 사용할 수 있다.
	
	@Override
	public void run() {
		for(int i = 0; i < 5; i++) {
			System.out.println("상속받은 Hello - Thread 클래스가 실행 중 입니다.");
		}
	}
	
}

 

 

하나의 실행 클래스 내부에 많은 수의 Thread를 작성할 경우 스파게티 코드가 될 수 있어 관리가 어려워질 수 있다. 이와 같은 경우 클래스에 직접 상속받아 사용하는 방법을 제공한다. 선언 방법은 가능하다. 위의 코드처럼 먼저 Thread 자체를 상속받는다. 그 후 run 메서드를 오버 라이딩하여 실행될 코드를 작성해주면 된다.


이제 메인 메서드로가 이 3가지 스레드를 사용해 보겠다.

package Thread;

public class main {

	public static void main(String[] args) {

		Thread thread1 = new Thread(()-> {
			for(int i = 0; i < 5; i++) {
				System.out.println("Thread1 이 실행중입니다.");
			}

		});	
		
		// Thread(() -> { . . . } ); 은 람다식으로써
		// Thread(new Runnable(){ public void run(){ . . . } }); 
        	// 과 같은 동작을 한다.
		// Thread Runnable 객체를 구현해야지 동작된다.
		Thread thread2 = new Thread(()-> {
			for(int i = 0; i < 5; i++) {
				System.out.println("Thread2 이 실행중입니다.");
			}

		});	
		
		Hello thread3 = new Hello();
		//thread 상속 클래스 로 스레드 객체 생성
		
		thread1.start();
		thread2.start();
		thread3.start();	
	}
}        

 

실행결과를 확인해보면, 우선순위가 모두 같아 스레드 호출 순에 상관없이  run() 메서드가 수행되는 것을 확인할 수 있다.