개발자 미니민의 개발스터디

[JAVA] 자바 - 데몬 스레드 (Daemon Thread) / 스레드 종료

by mini_min
[JAVA] 
자바 - 데몬 스레드 (Daemon Thread) /스레드 종료

✔️ 데몬 스레드 개념

: 다른 일반 스레드를 돕는 보조적인 역할을 하는 스레드이다.

: 일반 스레드가 모두 종료되면 데몬 스레드도 자동 종료된다.

: 데몬 스레드는 일반 스레드로부터 요청을 받아 특정 서비스를 수행하는 작업을 한다.

 

✨ setDaemon : 스레드를 데몬 스레드 혹은 사용자 스레드로 설정한다. 꼭 시작 전에 호출해야한다.

public static void main(String[] args) {
		DemoThread t1 = new DemoThread();
		DemoThread t2 = new DemoThread();
		DemoThread t3 = new DemoThread();
		
		
		//스레드를 데몬 스레드로 만들기
		t1.setDaemon(true);
		t2.setDaemon(true);
		t3.setDaemon(true);
		
		
		t1.start();
		t2.start();
		t3.start();
		
		try {
			t1.join(); //스레드가 종료될 때까지 대기   위에 3개가 도는 동안까지 대기시키기 아래 프린프ln 으로 못 넘어감! 
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		System.out.println("main end...");
		//

	}

}


class DemoThread extends Thread {
	@Override
	public void run() {
		for(int i=1; i<=20; i++) {
			System.out.println(getName() + " - > " + i);
			
			try {
				sleep(500);
			} catch (Exception e) {
			}
			
			
		}
	}
💡 t1.join(); //스레드가 종료될 때까지 대기 위에 3개가 도는 동안까지 대기시키기 아래로 못내려간다.

 

 

✔️ 스레드 우선순위 

: 자바의 스레드 스케쥴링은 우선순위 방식과 라운드 로빈 방식

✨ 우선순위 방식 : 우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케쥴링 하는 것

✨ 라운드 로빈 방식 : 시간 할당량을 정해서 스레드를 정해진 시간만큼 실행하고 다른 스레드를 실행하는 방식이다.

(JVM에 의해 정해지는거라 코드로 제어할 수 없다.)

💡 스레드의 우선 순위는 스레드를 생성한 스레드로부터 상속받는다. 

 

 

✔️ 스레드 종료 - stop

: Thread 클래스의 stop() 메소드를 호출하면 스레드를 종료할 수 있지만, 권장안함!❌

public static void main(String[] args) {
		
		MyThread2 mt = new MyThread2();
		Thread t = new Thread(mt);
		

		t.start();
		
		try {
			Thread.sleep(3000);
		} catch (Exception e) {
		}
	
		
		//t.stop();
		// 스레드 종료. 권장하지 않음
		// 스레드 종료가 안뜸. 스레드 리소스가 다 닫히지 않은 것! 
		
		mt.stopTask();
		System.out.println("메인 종료.........");
		
	}

}

// 스레드 종료
class MyThread2 implements Runnable {
	
	private boolean bTask = true;
	
	@Override
	public void run() {
		long n = 0;
		
		try {
			while(bTask) {
				System.out.println("스레드 : "+ n++);
				Thread.sleep(500);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		System.out.println("스레드 종료 .. ");
	
	}
	
	public void stopTask() {
		this.bTask = false;
	}
	
	
}
💡 //t.stop(); 
스레드 리소스가 다 닫히지 않아서 불안정하다는 말이다.

 

 

✔️ 스레드 종료 - interrupt()

: interrupt() 로 메소드를 종료시킬 수 있다. 

: 스레드가 sleep(), wait(), join() 등의 메소드에 의해 대기 상태에서 interrupt() 메소드 호출하면 interruptedException 예외로 스레드가 종료된다.

public static void main(String[] args) {
		Thread t = new Thread(new MyThread3());
		
		t.start();
		
		
		try {
			Thread.sleep(3000);
		} catch (Exception e) {
		}
		
		
		// t.stop(); // 스레드 종료가 출력 안됨 / 권장 안한다.
		t.interrupt();
		
		System.out.println("메인 종료...");
	}
}


// 이것도 스레드 종료 2번째 방법
class MyThread3 implements Runnable {

	@Override
	public void run() {
		long n = 0;
		
		try {
			while(true) {
				System.out.println("스레드 : " + n++);
				Thread.sleep(500);
			}
			
		} catch (InterruptedException e) {
			System.out.println("인터럽트 발생...");
		}
		
		System.out.println("스레드 종료...");
		
		
	}
}

 

 

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기