Programming Languages/Java

[Java] - 쓰레드(Thread)의 사용

Jesse 2021. 5. 22. 00:21

쓰레드란 무엇인가?

쓰레드가 무엇인지에 대해서 검색하면 프로세스 내에서 실행되는 흐름의 단위라고 나온다.

기본적으로 하나의 프로세스 당 최소 한개의 쓰레드를 가진다.

즉, 이 말은 하나의 프로세스 내에 여러 쓰레드를 가질수도 있다는 것을 뜻한다.

 자바에서 쓰레드를 구현하는 방법에는 두가지가 있습니다.

  • Thread
  • Runnable

둘의 차이는 Thread를 클래스라서 extends를 이용해서 상속 받아야 되지만 Runnable은 인터페이스 이기 때문에 implements를 이용해서 삭속 받는다는 것이다. Thread 클래스를 상속 받아서 구현하면 다른 클래스를 상속 받을수 없지만 Runnable 인터페이스를 상속 받으면 동시에 다른 클래스도 상속 받을수 있다는 장점이 있다.

둘 모두 예시를 통해 확인해보자.

 Thread을 이용한 구현

package test;

class Worker extends Thread{
	public void run() {
		for ( int i=0;i<20;i++)
			System.out.println("Worker Thread 일하다 "+i);
	}
}

public class TestThread {
	public static void main(String[] args) {
		System.out.println("**main thread 시작**");
		Worker workerThread = new Worker();
		workerThread.start();
		for (int i = 0;i<20;i++) {
			System.out.println("main thread 일한다"+i);
		}
		System.out.println("**main thread 종료**");
	}
}

main에 있는 쓰레드와 별도로 생성한 worker 쓰레드가 독립적으로 순서에 관계 없이 동작 된다는 걸 보여주고 싶었다. 그런데 i를 20개만 해두어서 그런가 아무리 다시 실행 시켜도 main 쓰레드가 다 작업을 마친 후에 worker 쓰레드가 실행 된다. 

이번에는 i의 숫자를 높여 보도록 하자. 

Runnable을 이용한 구현

package test;

class Worker implements Runnable{
	public void run() {
		for ( int i=0;i<50;i++)
			System.out.println("Worker Thread 일하다 "+i);
	}
}

public class TestThread {
	public static void main(String[] args) {
		System.out.println("**main thread 시작**");
		Worker worker = new Worker();
		Thread workerThread = new Thread(worker);
		workerThread.start();
		for (int i = 0;i<50;i++) {
			System.out.println("main thread 일한다"+i);
		}
		System.out.println("**main thread 종료**");
	}
}

Runnable 인터페이스를 통해 구현하였고 i의 숫자를 50까지 높였다.

main 쓰레드와 worker 쓰레드는 서로 독립적이기 때문에 이렇게 불규칙하게 출력 되는걸 알수 있다.

실행 시킬때마다 순서가 바뀐다.

당연한 결과다.