자바 공부/[자바] 기본 공부

[자바 공부 4일차] 쓰레드와 상태 제어

햅2024 2024. 11. 11. 20:06

start() : 시작

sleep() : 주어진 시간 만큼 blocked 된 후 다시 run으로 돌아온다.

wait() : notify() 할 때까지 blocked 돼 있는다

yield() : 다른 쓰레드에게 자원을 양보한다.

join() : 종료될 때까지 대기

 

  • Join

join을 사용하면 해당 쓰레드가 끝날 때까지 기다린다.

더보기
더보기
package JavaUtil.exam;

public class MyThread5 extends Thread {
	public void run()
	{
		for(int i=0;i<5;i++) {
			System.out.println("My Thread5 : " + i);
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
package JavaUtil.exam;

public class JoinExam {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyThread5 t5 = new MyThread5();
		t5.start();
		
		System.out.println("시작");
		
		try {
			t5.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} //해당 쓰레드가 끝날 떄까지 기다림
		
		
		System.out.println("종료");
	}

}
시작
My Thread5 : 0
My Thread5 : 1
My Thread5 : 2
My Thread5 : 3
My Thread5 : 4
종료

 

 

  • Wait와 notify

a라는 쓰레드에서 b.wait() 했을 때:

a 쓰레드를 b라는 쓰레드에서 notify 할 때까지 멈춰놓는다.

 

package JavaUtil.exam;

public class ThreadB extends Thread {
	int total;
	
	public void run()
	{
		synchronized (this) {
			for(int i=0;i<5;i++) {
				System.out.println(i + "를 더합니다");
				total+= i;
				
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			notify();
		}
	}
}
package JavaUtil.exam;

public class ThreadA {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ThreadB b = new ThreadB();
		b.start();
		
		synchronized(b)
		{
			try {
				System.out.println("b가 완료될 때까지 기다립니다");
				b.wait();
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
			
			System.out.println("Total is : " + b.total);
		}
	}

}

위와 같은 코드의 경우

ThreadA에서 ThreadB를 실행시키는 거다.

우선 ThreadB가 완료될 때까지 기다린다.

싱크로나이즈드 된 부분이 완료되면 notify()를 통해 wait된 A부분을 깨울 것이다.

그럼 그 다음 부분이 실행된다. 

 

b가 완료될 때까지 기다립니다
0를 더합니다
1를 더합니다
2를 더합니다
3를 더합니다
4를 더합니다
Total is : 10

 

  • 데몬 : 리눅스, 유닉스 계열의 운영체제에서 백그라운드로 동작하는 프로그램
  • 데몬 쓰레드 : 자바에서 백그라운드로 동작하는 쓰레드(ex.자동 저장, 일정한 시간 마다 맞춤법 검사 등)

데몬 쓰레드는 일반 쓰레드가 모두 종료되면 강제적으로 종료된다.

 

package JavaUtil.exam;

public class DemonThread implements Runnable {

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true)
		{
			System.out.println("데몬 쓰레드가 실행 중입니다");
			
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				break;
			}
		}
	}

	public static void main(String[] args) {
		Thread t = new Thread(new DemonThread());
		t.setDaemon(true); //Daemon쓰레드로 설정
		t.start();
		
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("메인쓰레드가 종료됩니다.");
	}
}
데몬 쓰레드가 실행 중입니다
데몬 쓰레드가 실행 중입니다
메인쓰레드가 종료됩니다.