오답노트

[Java] Thread 본문

Java

[Java] Thread

권멋져 2023. 7. 11. 11:22

Thread

프로그램이 실행되면 OS로 부터 메모리를 할당받아 프로세스 상태가 된다.

thread 하나의 프로세스는 하나 이상의 thread를 가지게 되고, 실제 작업을 수행하는 단위는 thread이다.

 

Multi - Thread

쓰레드가 동시에 수행되는 프로그래밍이다. 이는 여러 작업이 동시에 실행되는 효과가 있다.

하지만 쓰레드가 모두 공유하는 데이터에 대해서 동기화를 구현하지 않으면 오류가 발생할 수 있다.

 

Thread 객체 상속

class MyThread extends Thread{
	public void run() {
		int i;
		for(i = 1; i < 201 ; i++) {
			System.out.print(i+"\t");
		}
	}
}

public class ThreadTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println(Thread.currentThread() + "start");
		MyThread th1 = new MyThread();
		MyThread th2 = new MyThread();
		
		th1.start();
		th2.start();
		
		System.out.println(Thread.currentThread() + "end");
	}

}

Runnable 인터스페이스 사용

class MyThread implements Runnable{

	@Override
	public void run() {
		int i;
		for(i = 1; i < 201 ; i++) {
			System.out.print(i+"\t");
		}		
	}

}

public class ThreadTest {

	public static void main(String[] args) {
		System.out.println(Thread.currentThread() + "start");
		MyThread runnable = new MyThread();
		
		Thread th1 = new Thread(runnable);
		Thread th2 = new Thread(runnable);
		th1.start();
		th2.start();
		
		System.out.println(Thread.currentThread() + "end");
	}

}

Thread 상태

쓰레드는 Runnable과 Not Runnable 상태가 존재하고

Runnable에서 쓰레드가 활동하기 시작하면 Run 상태, 쓰레드가 종료되면 Dead 상태가 된다.

또 Runnable 상태에서 sleep, wait, join 메소드를 통해 Not Runnable 상태로 변할 수 있다.

 

  • sleep : 지정한 시간동안 Thread를 Not Runnable 상태로 만든다. 지정한 시간 후 다시 Runnable 상태가 된다.
  • wait : 사용 가능한 리소스가 있을 때까지 Not Runnable 상태로 만든다. 사용 가능한 리소스가 있을 때, notify 함수를 통해 Runnable 상태가 된다.
  • join : 다른 쓰레드가 멈출 때까지 기다리게 한다. 다른 쓰레드가 멈춘후 다시 Runnable 상태가 된다.

join 예제

public class JoinTest extends Thread{
	int start;
	int end;
	int total;
	
	public JoinTest(int start, int end) {
		this.start = start;
		this.end = end;
	}
	
	public void run() {
		int i;
		for(i = start ; i<=end; i++) {
			total += i;
		}
	}

	public static void main(String[] args) {
		
		System.out.println(Thread.currentThread() + "start");
		
		JoinTest jt1 = new JoinTest(1,50);
		JoinTest jt2 = new JoinTest(51,100);
		
		jt1.start();
		jt2.start();
		
		try {
			jt1.join();
			jt2.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		int lastTotal = jt1.total + jt2.total;
		
		System.out.println(jt1.total);
		System.out.println(jt2.total);
		
		System.out.println(lastTotal);
		
		System.out.println(Thread.currentThread() + "end");
	}

}

join이 호출 되면 현재 진행 중이던 쓰레드(main)를 멈추고, join을 호출한 인스턴스의 쓰레드가 실행된다. 이 쓰레드가 끝날 떄까지 이전 진행 중이던 쓰레드는 Not Runnalbe 상태가 된다.

'Java' 카테고리의 다른 글

[Spring JPA] Spring Data JPA  (0) 2023.07.18
[Java] Multi Thread Synchronization  (0) 2023.07.11
[Java] 직렬화  (0) 2023.07.11
[Java] IOStream  (0) 2023.07.10
[Java] 사용자 정의 예외 처리  (0) 2023.07.10