๐ŸŒ WEB/JAVA

๋‚ด๊ฐ€ ๋ณด๋ ค๊ณ  ์ •๋ฆฌํ•˜๋Š” JAVA ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ 4- ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ, ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน

์• ์ •์“ฐ 2021. 10. 6. 00:52

๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ

์ฃผ ์Šค๋ ˆ๋“œ์˜ ์ž‘์—…์„ ๋•๋Š” ๋ณด์กฐ์ ์ธ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋Š” ๊ฐ•์ œ์ ์œผ๋กœ ์ž๋™ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์ ์šฉ ์˜ˆ๋กœ๋Š” ์ž๋™ ์ €์žฅ, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ๋“ฑ์ด ์žˆ๋Š”๋ฐ ์ด ๊ธฐ๋Šฅ๋“ค์€ ์ฃผ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๊ฐ™์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

 

๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด์ค€ ํ›„

public class DaemonThread extends Thread{
	public void save(){
    	// ์ž๋™ ์ €์žฅ
        }
	public void run(){
    	save();
	}
}

๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ setDaemon ์„ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

public class mainThread(){
	public static void main(String[] args){
    	DaemonThread daemonThread = new DaemonThread();
        daemonThread.setDaemon(true); // start() ๋ณด๋‹ค ๋จผ์ € ์„ ์–ธํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด Exception ๋ฐœ์ƒ
        daemonThread.start();
	}
}

 

์Šค๋ ˆ๋“œ ๊ทธ๋ฃน

๊ด€๋ จ๋œ ์Šค๋ ˆ๋“œ๋ฅผ ๋ฌถ์–ด์„œ ๊ด€๋ฆฌํ•  ๋ชฉ์ ์œผ๋กœ ์ด์šฉํ•œ๋‹ค.

์Šค๋ ˆ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์— ํฌํ•จ๋˜๋Š”๋ฐ,

๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑํ•œ ์Šค๋ ˆ๋“œ์™€ ๊ฐ™์€ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์— ์†ํ•˜๊ฒŒ ๋œ๋‹ค.

 

// ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน ์ด๋ฆ„ ์–ป๊ธฐ
ThreadGroup group = Thread.currentThread().getThreadGroup();
String groupName = group.getName();

// ํ”„๋กœ๊ทธ๋ž˜์Šค ๋‚ด์—์„œ ์‹คํ–‰์ค‘์ธ ๋ชจ๋“  ์Šค๋ ˆ๋“œ ์ •๋ณด ์–ป๊ธฐ
// key = ์Šค๋ ˆ๋“œ ๊ฐ์ฒด value = ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ ๊ธฐ๋ก์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด
Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();

 

๋ช…์‹œ์ ์œผ๋กœ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์„ ๋งŒ๋“ค๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ

// ์ด๋ฆ„๋งŒ ์ค„ ๊ฒฝ์šฐ
ThreadGroup group = new ThreadGroup(String name);

// ๋ถ€๋ชจ ThreadGroup๊ณผ ๊ฐ™์ด ์ค„ ๊ฒฝ์šฐ
// ๋ถ€๋ชจ ์Šค๋ ˆ๋“œ ๊ทธ๋ฃน์„ ์ง€์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ํ˜„์žฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์†ํ•œ ๊ทธ๋ฃน์˜ ํ•˜์œ„ ๊ทธ๋ฃน์œผ๋กœ ์ƒ์„ฑ
ThreadGroup group = new ThreadGroup(ThreadGroup parent, String name);

// ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ๊ทธ๋ฃน์„ ์ค„ ๊ฒฝ์šฐ (๋งค๊ฐœ๊ฐ’ ์—ฌ๋Ÿฌ๊ฐ€์ง€์ž„)
Thread t = new Thread(ThreadGroup group,Runnable target, String name);

 

์Šค๋ ˆ๋“œ๋ฅผ ๊ทธ๋ฃน์— ํฌํ•จํ•˜๋ฉด ์–ด๋–ค๊ฒŒ ์ข‹์„๊นŒ? ๊ทธ๋ฃน๋‚ด์— ํฌํ•จ๋œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ์ผ๊ด„ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

interrupt() ๋ฉ”์„œ๋“œ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ๋ฃน ์•ˆ์— ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.  (์ด ๋ฉ”์„œ๋“œ๋Š” ํฌํ•จ๋œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ์˜ interrupt() ๋ฉ”์„œ๋“œ๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ.)

 

public class ThreadGroup{
	public static void main(String[] args){
    
    	// aejoeng ๊ทธ๋ฃน์— ๋‘ ์Šค๋ ˆ๋“œ๋ฅผ ํฌํ•จ์‹œํ‚ด
    	ThreadGroup group = new ThreadGroup("aejeong");
        WorkThread workThreadA = new WorkThread(group,"workThreadA");
		WorkThread workThreadB = new WorkThread(group,"workThreadB");
        
        workThreadA.start();
        workThreadB.start();
        
        ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
        // ํ˜„์žฌ ๊ทธ๋ฃน์— ํฌํ•จ๋œ ์Šค๋ ˆ๋“œ์™€ ํ•˜์œ„ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅ
        mainGroup.list();
        
        // WorkThread์—์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•œ InterruptedExcetion์„ ๋ฐœ์ƒ์‹œ์ผœ ์Šค๋ ˆ๋“œ๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.
        group.interrupt();
	}
}
๋ฐ˜์‘ํ˜•