Thread

์˜ˆ์ˆ‘ยท2024๋…„ 1์›” 10์ผ

JAVA-Thread

๋ชฉ๋ก ๋ณด๊ธฐ
1/4
post-thumbnail

โญThread(์Šค๋ ˆ๋“œ)

๐Ÿ’œthread(์Šค๋ ˆ๋“œ)

ํ”„๋กœ๊ทธ๋žจ ํ•˜๋‚˜์—์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
thread ๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.
์ฃฝ์€ thread๋Š” ์žฌํ™œ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

โ†’ ์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜๋‚˜์˜ ๊ฒŒ์ž„์—์„œ ์—ฌ๋Ÿฌ ์ ‘์†์ž๊ฐ€ ์žˆ๋‹ค๋ฉด ์ ‘์†์ž ํ•œ ๋ช… ํ•œ ๋ช…์„ thread๋ผ ํ•œ๋‹ค.
โ†’ ๊ฐ€์ƒ ๋จธ์‹ (JVM)์„ ํ†ตํ•ด ์–ด๋–ค ์Šค๋ ˆ๋“œ(thread)๊ฐ€ ์‹คํ–‰ ๋  ์ง€ ์ •ํ•ด์ง„๋‹ค.
โ†’ ์Šค๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


โ†’ start๋ฅผ ํ•˜๋Š” ์ˆœ๊ฐ„ t1, t2, t3 ๋Š” JVM์— ๋ฝ‘ํžˆ๊ธฐ ์œ„ํ•œ ๊ฒฝ์Ÿ์„ ํ•œ๋‹ค.

๐Ÿ’™๋ณ‘๋ ฌ(Parallel) VS ๋ณ‘ํ–‰(Concurtency)

1) ๋ณ‘๋ ฌ
โ†’ H/W(ํ•˜๋“œ ์›จ์–ด)์ ์ธ ๊ฐœ๋…์ด๋‹ค.
(๋ฉ€ํ‹ฐ ์ฝ”์–ด์—์„œ ์‚ฌ์šฉ)
โ†’ ์‹ค์ œ๋กœ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

2) ๋ณ‘ํ–‰
โ†’ S/W(์†Œํ”„ํŠธ ์›จ์–ด)์ ์ธ ๊ฐœ๋…์ด๋‹ค.
โ†’ ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋™์‹œ์— ์ง„ํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
(์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณ‘๋ ฌ์ ์ธ ์‹คํ–‰์„ ๋А๋ผ๊ฒŒ ํ•ด์ค€๋‹ค.)
โ†’ ๋ฉ€ํ‹ฐ ์ฝ”์–ด๊ฐ€ ์•„๋‹˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ฉ€ํ‹ฐ ์ฝ”์–ด์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋А๋ผ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค.
(์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ์„ ์“ฐ๋Š” ์ด์œ ๊ฐ€ ๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.)
โ†’ ์‘๋‹ต์„ฑ ๋†’์ด๊ธฐ ์œ„ํ•ด thread๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
(ํ”„๋กœ๊ทธ๋žจ์ด ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด ๋ณ‘ํ–‰์„ฑ์„ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

๐Ÿ’œprocess(ํ”„๋กœ์„ธ์Šค)

thread ์˜ ์ง‘ํ•ฉ์„ ๋งํ•œ๋‹ค.

โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์šด์˜์ฒด๊ณ„์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹น๋ฐ›์•„ ์‹คํ–‰ ์ค‘์ธ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
โ†’ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ˜๋“œ์‹œ CPU ์™€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
โ†’ ์šด์˜์ฒด๊ณ„(O/S)๊ฐ€ ์‹คํ–‰ ํ•  ํŠน์ • ํ”„๋กœ์„ธ์Šค๋ฅผ ์ •ํ•œ๋‹ค.
โ†’ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ๋Š” ์šด์˜์ฒด๊ณ„(O/S)๊ฐ€ ์ •ํ•˜๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ์ด๋ฃจ์–ด์ง„๋‹ค.
์ด๋ฅผ ์Šค์ผ€์ค„๋ง ์ด๋ผ๊ณ  ํ•œ๋‹ค.


โ†’ ์œ„ ๊ทธ๋ฆผ์—์„œ ์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’™์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ

์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ : ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฒˆ๊ฐˆ์•„ ๊ฐ€๋ฉด์„œ ์‹คํ–‰๋˜๋Š” ์‹œ์Šคํ…œ์ด๋‹ค.

โ†’ ์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ์€ ์‚ฌ์‹ค ์ƒ ์‹œ๊ฐ„ ๋‹น ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•˜๋‚˜๋ฐ–์— ์—†๋‹ค.
(๋„ˆ๋ฌด ๋น ๋ฅด๊ฒŒ ๋˜๊ธฐ์— ์šฐ๋ฆฌ๊ฐ€ ๋А๋ผ์ง€ ๋ชปํ•  ๋ฟ์ด๋‹ค.)
์œ„ ๊ทธ๋ฆผ์—์„œ ๋ณด๊ณ  ๋‹ค์‹œ ์ดํ•ด๋ฅผ ํ•˜์ž๋ฉด time1์ด๋ผ๋Š” ์‹œ๊ฐ„ ๋™์•ˆ B๋งŒ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”๋ฐ ์ด๋ฅผ ์ด์•ผ๊ธฐํ•œ๋‹ค.
โ†’ ์ฆ‰, ์‹œ๊ฐ„์„ ์ชผ๊ฐœ์„œ ์‹œ๊ฐ„๋งˆ๋‹ค ์‹คํ–‰ํ•  ํ”„๋กœ๊ทธ๋žจ์„ ์ •ํ•ด์ฃผ๋Š” ์ผ์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
โ†’ ๋‹ค๋ฅธ ์ฝ”์–ด์—์„œ ๊ฐ™์€ ์‹œ๊ฐ„์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’œ์Šค๋ ˆ๋“œ ๋งŒ๋“ค๊ธฐ

run( ) ์•ˆ์—๋„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
(main ๋ฉ”์†Œ๋“œ๋„ thread ์ธ๋ฐ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๊ฒƒ์ฒ˜๋Ÿผ)

1) ๋ฐฉ๋ฒ• 1

class ExtendThread extends Thread{
	// run() ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์žฌ์ •์˜
	public void run() {
		System.out.println("Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์† : " + Thread.currentThread().getName());
	}
}
public class ExtendThreadTest {

	public static void main(String[] args) {
		ExtendThread et = new ExtendThread();
		et.start();
		System.out.println("end of main : " + Thread.currentThread().getName());

	}
}

โ†’ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.
โ†’ start( ) : thread๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.
์ด๋•Œ, ์œ„์—์„œ ๋ณด๋ฉด et ๋ผ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ๊ธด๋‹ค.
์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ๊ธด ํ›„ ๊ฐ€์ƒ๋จธ์‹ ์ด ์–ด๋–ค ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ง€ ์ •ํ•ด์•ผ ํ•œ๋‹ค.
โ‡’ ์ฆ‰, main ์Šค๋ ˆ๋“œ ์™€ et ์Šค๋ ˆ๋“œ 2๊ฐœ๊ฐ€ ์ƒ๊ธฐ๊ณ  ์ด๋ฅผ, ๋“€์–ผ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ํ•œ๋‹ค.
โ†’ ์ดํ›„ ExtendThread ํด๋ž˜์Šค์˜ run()์ด ์‹คํ–‰๋˜๊ณ  ์ข…๋ฃŒ๋˜๋ฉด ๋ฐ”๋กœ ExtendThread๊ฐ€ ์†Œ๋ฉธ๋œ๋‹ค.
โ†’ currentThread( ) : ํ˜„์žฌ ์ด ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šค๋ ˆ๋“œ ๊ฐ์ฒด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’™Runnable

2) ๋ฐฉ๋ฒ• 2_1

public class RunnableThreadTest {

	public static void main(String[] args) {
		// Thread ์ƒ์„ฑ์ž์— RunnableThread ์ธ์Šคํ„ด์Šค๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ
		Thread t = new Thread(new RunnableThread());
		t.start();
		System.out.println("end of main");
	}

}

class RunnableThread implements Runnable{
	// run() ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์žฌ์ •์˜
	@Override
	public void run() {
		System.out.println("Runnable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„");
	}
}

โ†’ ์ธํ„ฐํŽ˜์ด์Šค Runnable ์˜ run( ) ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ๋‹ค.
โ†’ Runnable : ์Šค๋ ˆ๋“œ๊ฐ€ ํ•  ์ผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ด๋‹ค.

๋ฐฉ๋ฒ•1 ๋ณด๋‹ค Runnable์ด ๋” ์ข‹์„ ์ˆ˜๋„ ์žˆ๋‹ค.
์ž๋ฐ”์—์„œ๋Š” ๋‹จ์ผ ์ƒ์†๋งŒ ํ—ˆ๋ฝํ•˜๋Š”๋ฐ ์ด๋ฏธ ๋‹ค๋ฅธ ๊ฒƒ์„ ์ƒ์†๋ฐ›์€ ๊ฒฝ์šฐ, Runnable์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ Thread ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ์ „๋‹ฌํ•˜์—ฌ Thread ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฌ๋ฉด ๋” ์œ ์—ฐํ•œ ๊ด€๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2) ๋ฐฉ๋ฒ• 2_2

class ThreadEx1 extends Thread{
	public void run() {
		for(int i=0; i<5; i++) {
			System.out.println("t1 : " + getName());
		}
	}
}

class ThreadEx1_2 implements Runnable{
	public void run() {
		for(int i=0; i<5; i++) {
			System.out.println("t2 : " + Thread.currentThread().getName());
		}
	}
}

public class CreateThread {
	public static void main(String[] args) {
		ThreadEx1 t1 = new ThreadEx1();
		
		Runnable r = new ThreadEx1_2();
		Thread t2 = new Thread(r);
		
		t1.start();
		t2.start();
		
		System.out.println(Thread.currentThread().getName());
	}
}


โ†’ ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด Thread๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ž‘๋™๋˜์ง€ ์•Š์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
โ†’ ๊ทธ๋ฆฌ๊ณ  ์Šค๋ ˆ๋“œ๊ฐ€ ํ•  ์ผ์ด ์•„์ง ๋๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ”„๋กœ๊ทธ๋žจ์€ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ’œthread state

1) NEW
2) RUNNABLE
3) BLOCK
4) WAITING
5) TIMED_WATING
6) TERMINATED

public class NormalProcess{

	public static void main(String[] args) throws Exception{
		String input = JOptionPane.showInputDialog(
				"์•„๋ฌด ๊ฐ’์ด๋‚˜ ์ž…๋ ฅํ•˜์„ธ์š”."
		);
		//์œ„๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋ฐ‘์— ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๊ฒŒ ๋ธ”๋กœํ‚น์ด๋‹ค.
		System.out.println("์ž…๋ ฅํ•˜์‹  ๊ฐ’์€ " + input + "์ž…๋‹ˆ๋‹ค.");
		
		for(int i=10; i>0; i--) {
			System.out.println(i);
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
				
			}
		}
	}
}

โ†’ ์œ„ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ’์„ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉด for๋ฌธ์„ ๋Œ๋ฉด์„œ ์ˆซ์ž๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  Thread.sleep(1000) ์„ ํ†ตํ•ด 1์ดˆ ๋™์•ˆ ์ผ์‹œ ์ •์ง€๊ฐ€ ๋˜๊ณ  ๋‹ค์‹œ ์ˆซ์ž๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
โ†’ JOptionPane์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋ฐ‘์˜ ์ฝ”๋“œ๋“ค์€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋ฐ ์ด๋ฅผ ์ž…์ถœ๋ ฅ ๋ธ”๋กœํ‚น์ด๋ผ๊ณ  ํ•œ๋‹ค.
โ†’ Thread.sleep(millisecond) : 1/1000 ์ดˆ ๋™์•ˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ž ๋“ค๊ฒŒ ํ•œ๋‹ค.(์ผ์‹œ ์ •์ง€ ์‹œํ‚จ๋‹ค.)
์œ„ ๊ทธ๋ฆผ์—์„œ ๋ณธ๋‹ค๋ฉด NOT RUNNABLE ์—์„œ ์ž๋™์œผ๋กœ ํ’€๋ ค์„œ RUNNABLE๋กœ ๊ฐ„๋‹ค.

class ThreadEx extends Thread{
	public void run() {
		for(int i=10; i>0; i--) {
			System.out.println(i);
			try {
				sleep(1000);
			} catch (Exception e) {
				
			}
		}
	}
}

public class UsingThread {
	public static void main(String[] args) throws Exception{
		ThreadEx th1 = new ThreadEx();
		
		th1.start();
		
		String input = JOptionPane.showInputDialog(
				"์•„๋ฌด ๊ฐ’์ด๋‚˜ ์ž…๋ ฅํ•˜์„ธ์š”."
		);
		System.out.println("์ž…๋ ฅํ•˜์‹  ๊ฐ’์€ " + input + "์ž…๋‹ˆ๋‹ค.");
	}
}

โ†’ ์œ„์˜ ์ฝ”๋“œ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜จ๋‹ค.
์œ„์—์„œ๋Š” ์ž…์ถœ๋ ฅ ๋ธ”๋กœํ‚น์ด ๊ฑธ๋ ค์žˆ์ง€๋งŒ ์ง€๊ธˆ ์ฝ”๋“œ๋Š” ์ž…์ถœ๋ ฅ ๋ธ”๋กœํ‚น์ด ์—†์ด ์‹คํ–‰ํ•˜๋ฉด ๋ฐ”๋กœ ์ˆซ์ž๋ฅผ ์…€ ์ˆ˜ ์žˆ๋‹ค.
โ†’ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ์ด์œ ๋Š” ์ง€๊ธˆ ์ฝ”๋“œ์—์„œ๋Š” th1์˜ ์Šค๋ ˆ๋“œ๊ฐ€ main ์Šค๋ ˆ๋“œ์™€ ๋”ฐ๋กœ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
main์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰ ๋ถˆ๊ฐ€ ์ƒํƒœ๊ฐ€ ๋˜์–ด๋„ th1์€ ๋Œ€๊ธฐ์—ด์— ์žˆ๋‹ค๊ฐ€ RUNNABLE ์ƒํƒœ๊ฐ€ ๋˜๊ธฐ์— ์ˆซ์ž๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ’™๋ฌธ๋งฅ๊ตํ™˜(Context Switching)

public class NormalProcess{
	public static void main(String[] args) throws Exception{
		long startTime = System.currentTimeMillis();
		for(int i=0; i<300; i++) {
			System.out.print("-");
		}
		System.out.println("์†Œ์š”์‹œ๊ฐ„1 : " + (System.currentTimeMillis() - startTime));
		
		for(int i=0; i<300; i++) {
			System.out.print("l");
		}
		System.out.println("์†Œ์š”์‹œ๊ฐ„2 : " + (System.currentTimeMillis() - startTime));
	}
}
class ThreadEx extends Thread{
	public void run() {
		for(int i=0; i<300; i++) {
			System.out.print("l");
		}
		System.out.println("์†Œ์š”์‹œ๊ฐ„2 : " + (System.currentTimeMillis() - UsingThreadProcess.startTime));
	}
}

public class UsingThreadProcess {
	static long startTime = 0;

	public static void main(String[] args) {
		ThreadEx th1 = new ThreadEx();
		
		startTime = System.currentTimeMillis();
		th1.start();
		for(int i=0; i<300; i++) {
			System.out.print("-");
		}
		System.out.println("์†Œ์š”์‹œ๊ฐ„1 : " + (System.currentTimeMillis() - UsingThreadProcess.startTime));

	}
}

โ†’ 2๊ฐœ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์Šค๋ ˆ๋“œ๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ๊ฒŒ ๋” ๋น ๋ฅธ๋ฐ ์™œ ์šฐ๋ฆฌ๋Š” ์Šค๋ ˆ๋“œ๋ฅผ ์“ฐ๋Š” ์ง€ ์ƒ๊ฐํ•ด๋ด์•ผ ํ•œ๋‹ค.
์ด์œ ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ '๋ฌธ๋งฅ ๊ตํ™˜' ์ด๋‹ค.

โ†’ ์œ„ ๊ทธ๋ฆผ์„ ์ฐธ๊ณ ํ•˜๋ฉด, A,B์ฒ˜๋Ÿผ 1๊ฐœ์˜ main thread๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด A๊ฐ€ ์ผ์„ ํ•˜๋Š” ๋™์•ˆ B๋Š” ์ผ์„ ํ•˜์ง€ ๋ชปํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋“€์–ผ thread ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ตํ™˜ํ•˜๋ฉด์„œ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‹คํ–‰ํ•œ ๋ถ€๋ถ„๊นŒ์ง€ ์ €์žฅํ•ด์ค˜์•ผ ํ•œ๋‹ค.
์ €์žฅ ํ›„ ๋‹ค์‹œ ์ฝ์–ด์ฃผ๋Š” ์ผ๋„ ํ•ด์•ผํ•˜๋Š”๋ฐ, ์ด์™€ ๊ฐ™์ด ์ €์žฅํ•˜๊ณ  ์ฝ๋Š” ๊ฒƒ์„ ๋ฌธ๋งฅ๊ตํ™˜ ์ด๋ผ๊ณ  ํ•œ๋‹ค.
๋ฌธ๋งฅ๊ตํ™˜์„ ํ•˜๋ฉด ๋น„์šฉ๋„ ๋งŽ์ด ๋“ค๊ณ  ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€๋งŒ ์‘๋‹ต์„ฑ์ด ์ข‹๊ธฐ์— ์‚ฌ์šฉํ•œ๋‹ค.
(๋น ๋ฅด๊ฒŒ ๊ต๋Œ€๋ฅผ ํ•ด์„œ ๋™์‹œ์— ์ผ์ด ์ง„ํ–‰๋œ๋‹ค๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

๐Ÿ’œDaemonThread

DaemonThread : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” thread์ด๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ์ง€ ๋ชปํ•˜๋Š” ์ž‘์—…(๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…)์— ์‚ฌ์šฉํ•œ๋‹ค.

<thread์˜ ์ข…๋ฅ˜>
1) ์ผ๋ฐ˜ thread
2) DaemonThread

public class DaemonThreadTest {
	public static void main(String[] args) {
		// thread ์ƒ์„ฑ
		Thread t = new Thread() {
			public void run() {
				try {
					System.out.println("MyThread์‹œ์ž‘");
					// 5์ดˆ๊ฐ„ ๋ฉˆ์ถค
					Thread.sleep(5000);
					// thread ์ข…๋ฃŒ ๋ฉ”์„ธ์ง€
					System.out.println("MyThread์ข…๋ฃŒ");
				} catch(Exception e) {
					// ๋ฌด์‹œ..
				}
			}
		};
		// ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋กœ ์„ค์ •..
		t.setDaemon(true);
		// thread ์‹œ์ž‘
		t.start();
		
		// main ๋ฉ”์†Œ๋“œ ์ข…๋ฃŒ ๋ฉ”์„ธ์ง€
		System.out.println("main() ์ข…๋ฃŒ");
	}
}

โ†’ ํ”„๋กœ๊ทธ๋žจ์€ ๋ชจ๋“  thread ๊ฐ€ ๋‹ค ๋๋‚˜์•ผ ์ข…๋ฃŒ๊ฐ€ ๋œ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ณด์กฐ์ž‘์—…๊ฐ™์€ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ๊ณ„์† ๋™์ž‘ํ•˜๊ณ  ์žˆ์„ ๋•Œ๋„ ์žˆ๋‹ค. (= ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๊ณ„์† ๋™์ž‘ํ•˜๊ณ  ์žˆ๋‹ค.)
์ด๋กœ ์ธํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๊ฐ€ ์•ˆ ๋ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฐ ์• ๋“ค์„ DaemonThread๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ๋œ๋‹ค.
DaemonThread๋กœ ๋งŒ๋“ค๋ฉด ์ผ๋ฐ˜ thread๊ฐ€ ๋๋‚˜๋ฉด ๊ฐ™์ด ๋๋‚˜๊ฒŒ ๋œ๋‹ค.
setDaemon()์„ ํ†ตํ•ด DaemonThread๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.(๋‹จ, start() ์ „์— ํ•ด์ค˜์•ผ ํ•œ๋‹ค.)

public class DemonThreadTest2 {
	public static void main(String[] args) {
		Thread t = new Thread() {
			public void run() {
				try {
					System.out.println("MyThread ์‹œ์ž‘");
					Thread.sleep(100000);
					System.out.println("MyThread ์ข…๋ฃŒ");
				} catch (Exception e) {}
			}
		};
	
		t.setDaemon(true);
		t.start();
		Thread t2 = new Thread() {
			@Override
			public void run() {
				try {
					Thread.sleep(3000);
					System.out.println("t2์ข…๋ฃŒ");
				} catch(Exception e) {}
			}
		};
		t2.start();
		System.out.println("main() ์ข…๋ฃŒ");
	}
}

โ†’ ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ์œ„์™€ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ t2๋Š” DaemonThread๊ฐ€ ์•„๋‹ˆ๋ผ์„œ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.

๐Ÿ’œthread ์šฐ์„ ์ˆœ์œ„

class SomeThread extends Thread {
	public SomeThread(String name) {
		super(name);
	}
	@Override
	public void run() {
		String name = this.getName();
		for(int i=0; i<10; i++) {
			System.out.println(name + " is working");
		} 
	}
}

public class RunningTest {
	// main thread๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ NORM_PRIORITY(5)์ด๋‹ค. 1~10
	public static void main(String[] args) {
		SomeThread t1 = new SomeThread("A");
		SomeThread t2 = new SomeThread("B");
		SomeThread t3 = new SomeThread("C");
		/*
		 *  thread์˜ ์šฐ์„ ์ˆœ์œ„ ์„ค์ •
		 *  thread์šฐ์„ ์ˆœ์œ„ ๋ฐ”๊พธ๋Š”๊ฑฐ ํ•˜์ง€๋ง๊ธฐ.
		 */
		
//		ํ•ด์ฒด ํ›„ ์‹คํ–‰ ๊ฒฐ๊ณผ ๋น„๊ตํ•ด ๋ณผ๊ฒƒ
		t1.setPriority(Thread.MIN_PRIORITY);
		t2.setPriority(Thread.NORM_PRIORITY);
		t3.setPriority(Thread.MAX_PRIORITY);
		
		System.out.println(t1.getPriority());
		System.out.println(t2.getPriority());
		System.out.println(t3.getPriority());
		
		t1.start();
		t2.start();
		t3.start();
	}
}


โ†’ ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๊ฒฐ๊ณผ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฌด์กฐ๊ฑด ๋จผ์ € ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
๋‹จ์ง€, ํ™•๋ฅ ๋งŒ ์กฐ๊ธˆ ๋†’์—ฌ์ค„ ๋ฟ์ด๋‹ค.

<์šฐ์„  ์ˆœ์œ„๊ฐ€ 100% ๊ฐ€ ์•„๋‹Œ ์ด์œ >
โ†’ 100%๋ฅผ ์ฃผ๋ฉด ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋‚ฎ์€ ์• ๋“ค์€ ๊ธฐํšŒ๋ฅผ ์–ป์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ ์šฐ์„  ์ˆœ์œ„ ๋ง๊ณ  ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ์ฃผ๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€