hyeonha 2024. 8. 19. 14:07

ํ”„๋กœ๊ทธ๋žจ์˜ ํ•œ ์‹คํ–‰ ์ค„๊ธฐ๋ฅผ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ํ•œ๋‹ค!

์Šค๋ ˆ๋“œ

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์˜ ํ•œ ์ค„๊ธฐ

์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ (JVM)์€ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ์‹คํ–‰ ์ค„๊ธฐ๊ฐ€ ๋™์‹œ์— ์ง„ํ–‰๋˜๋„๋ก ํ—ˆ์šฉ

  1. ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„
    • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์ง„๋‹ค.
    • ๋†’์€ ์šฐ์„ ์ˆœ์œ„์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„์˜ ์Šค๋ ˆ๋“œ๋ณด๋‹ค ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.
  2. ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ
    • ์Šค๋ ˆ๋“œ๋Š” ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋กœ ํ‘œ์‹œ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค.
    • ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ๋™์ž‘ํ•˜๋ฉฐ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ•จ๊ป˜ ์ข…๋ฃŒ๋œ๋‹ค.
  3. ์ƒˆ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ ์‹œ ํŠน์ • ์ƒ์†
    • ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค ๋•Œ, ๊ทธ ์Šค๋ ˆ๋“œ๋Š” ์ƒ์„ฑํ•œ ์Šค๋ ˆ๋“œ์˜ ํŠน์ง•์„ ์ผ๋ถ€ ๋ฌผ๋ ค๋ฐ›๋Š”๋‹ค.
      •  ์šฐ์„  ์ˆœ์œ„ : ์ƒˆ ์Šค๋ ˆ๋“œ๋Š” ์ƒ์„ฑํ•œ ์Šค๋ ˆ๋“œ์™€ ๋™์ผํ•œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง
      • ๋ฐ๋ชฌ ์—ฌ๋ถ€ : ์ƒ์„ฑํ•œ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐ๋ชฌ์ด๋ฉด ์ƒˆ ์Šค๋ ˆ๋“œ๋„ ๋ฐ๋ชฌ์ด ๋œ๋‹ค.
public class ThreadExample {
	public static void main(String[] args) {
		Thread mainThread = Thread.currentThread();
		System.out.println("๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์šฐ์„  ์ˆœ์œ„ :" + mainThread.getPriority());
		
		Thread newThread = new Thread( () ->{
		            System.out.println("์ƒˆ ์Šค๋ ˆ๋“œ ์šฐ์„ ์ˆœ์œ„: " + Thread.currentThread().getPriority());
            System.out.println("์ƒˆ ์Šค๋ ˆ๋“œ ๋ฐ๋ชฌ ์—ฌ๋ถ€: " + Thread.currentThread().isDaemon());

});

newThread.start();

Thread daemonThread = mew Thread( () -> {
});

daemonThread.setDaemon(true);
daemonThread.start();

 

๐Ÿ’ก ์„ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ธก์ •ํ•˜๋Š” ์Šค๋ ˆ๋“œ๋„ ํฌ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค์—์„œ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋Š”๋ฐ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ์ผ๊นŒ?

 

A. ์•„๋‹˜ !! ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ์ด๋‹ค.

 

๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ vs ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ

  • ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜๋ฉฐ, ๋ชจ๋“  ๋น„๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋œ๋‹ค.
  • ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ : ๋ช…์‹œ์ ์œผ๋กœ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋œ๋‹ค.

๋‚˜๋„ ๋ฐ”๊ฟ€๊นŒ?

→ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๋Š” ์•ฑ์˜ ๋ชจ๋“  ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž๋™์œผ๋กœ ์ข…๋ฃŒ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์–ธ์ œ ์ •ํ™•ํžˆ ์ข…๋ฃŒ๋ ์ง€ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

๐Ÿ’ก ์Šค๋ ˆ๋“œ๋Š” ๋‹ค ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋Œ์•„๊ฐ€๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€?

 

A. ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šค๋ ˆ๋“œ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋œ๋‹ค.

  • ์—ฌ๊ธฐ์„œ์˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ : UI์™€ ์ง์ ‘์ ์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜์ง€ ์•Š๋Š” ์˜์—ญ

๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๊ธฐํƒ€์Šค๋ ˆ๋“œ

  • ๋ฉ”์ธ ์Šค๋ ˆ๋“œ : UI ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๋Š” ํŠน๋ณ„ํ•œ ์Šค๋ ˆ๋“œ
  • ๊ธฐํƒ€ ์Šค๋ ˆ๋“œ : ๋ฉ”์ธ ์Šค๋ ˆ๋“œ ์™ธ์˜ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ์ˆ˜ํ–‰

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰์˜ ์˜๋ฏธ

  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜์ง€๋งŒ ๊ทธ ์—ญํ• ๊ณผ ์ค‘์š”๋„๋Š” ๋‹ค๋ฆ„
  • ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ์™€ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ์˜ ์ฐจ์ด๋Š” ๋ฐ”๋กœ ์ƒ๋ช…์ฃผ๊ธฐ!

๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ vs ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ

  • ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ : ์•ฑ์˜ ๋‹ค๋ฅธ ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ชจ๋‘ ์ข…๋ฃŒ๋˜๋ฉด ๊ฐ•์ œ ์ข…๋ฃŒ๋œ๋‹ค.
  • ์ผ๋ฐ˜ ์Šค๋ ˆ๋“œ : ์ž‘์—…์ด ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ๋ช…์‹œ์ ์œผ๋กœ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์† ์‹คํ–‰๋œ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์Šค๋ ˆ๋“œ

  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰๋˜์ง€๋งŒ ๋ชฉ์ ๊ณผ ๊ด€๋ฆฌ๋ฐฉ์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ทจ๊ธ‰ ๊ฐ€๋Šฅ
  • ์˜ˆ ) ํฌ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค์˜ ์Šค๋ ˆ๋“œ๋Š” ์‹œ์Šคํ…œ์— ์˜ํ•ด ๋” ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ

java ๊ฐ€์ƒ ๋จธ์‹ (JVM)์˜ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ ๊ณผ์ •

  • JVM ์‹œ์ž‘
    • JVM์ด ์‹œ์ž‘๋  ๋•Œ ๋ณดํ†ต ํ•˜๋‚˜์˜ ๋น„ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๊ฐ€ ็”Ÿ
    • ์ด ์Šค๋ ˆ๋“œ๋Š” ์ฃผ๋กœ main ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•จ
    • ์ด๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ผ๊ณ  ํ•œ๋‹ค!
  • JVM ์‹คํ–‰ ์ง€์†
    • JVM์€ ์Šค๋ ˆ๋“œ๋“ค์„ ๊ณ„์† ์‹คํ–‰ํ•œ๋‹ค.
  • JVM ์ข…๋ฃŒ ์กฐ๊ฑด
    1. Runtime.exit() ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
      1. Runtime ํด๋ž˜์Šค์˜ exit ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ 
      2. ๋ณด์•ˆ ๊ด€๋ฆฌ์ž security manger)๊ฐ€ ์ด ์ข…๋ฃŒ ์ž‘์—…์„ ํ—ˆ์šฉํ•  ๊ฒฝ์šฐ
    2. ๋ชจ๋“  ๋น„ ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ์˜ ์ข…๋ฃŒ
      1. ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ์„ ๋•Œ
      2. ์Šค๋ ˆ๋“œ ์ข…๋ฃŒ์˜ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ
        1. run() ๋ฉ”์†Œ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜ํ™˜๋˜์–ด ๋๋‚˜๋Š” ๊ฒฝ์šฐ
        2. run() ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ์ค‘ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ณ  ์ „ํŒŒ๋œ ๊ฒฝ์šฐ

์Šค๋ ˆ๋“œ ์ƒ์„ฑํ•˜๊ธฐ 1 

  1. Thread ํด๋ž˜์Šค ์ƒ์†
    1. PrimeThread๊ฐ€ java์˜ Thread ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋‹ค
    2. → PrimeThread๊ฐ€ ์Šค๋ ˆ๋“œ๋กœ์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
  2. ์ƒ์„ฑ์ž ์ •์˜
    1. DDungThread ํด๋ž˜์Šค๋Š” long minPrime์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง„๋‹ค.
    2. ์ด ์ƒ์„ฑ์ž๋Š” ์ฃผ์–ด์ง„ ๊ฐ’์„ ํด๋ž˜์Šค์˜ minDDung ํ•„๋“œ์— ์ €์žฅํ•œ๋‹ค.
  3. run() ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ
    1. Thread ํด๋ž˜์Šค์˜ run() ๋ฉ”์†Œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•œ๋‹ค.
    2. ์ด ๋ฉ”์†Œ๋“œ ์•ˆ์— ์Šค๋ ˆ๋“œ๊ฐ€ ์‹คํ–‰ํ•  ์‹ค์ œ ์ž‘์—…์„ ์ •์˜ํ•œ๋‹ค.
// 1. ์Šค๋ ˆ๋“œ ํด๋ž˜์Šค ์ƒ์†
class DDungThread extends Thread {
	long minPrime;
	
	// 2. ์ƒ์„ฑ์ž ์ •์˜
	DDungThread(long minPrime) {
		this.minDDung = minDDung;
	}
	
	// 3. run ๋ฉ”์†Œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ
	public void run() {
		//
		}
	}
  1. ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ ๋ฐฉ์‹

์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ•˜๊ณ  start() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.

DDungThread DDungpi = new DDungThread(143);
DDungpi.start();

- ์ž‘๋™ ๋ฐฉ์‹

  1. start() ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด JVM์€ ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  run() ๋ฉ”์†Œ๋“œ๋ฅผ ์‹œ๋žณใ…‡ํ•œ๋‹ค.
  2. run() ๋ฉ”์†Œ๋“œ๋Š” ๋ณ„๋„์˜ ์Šค๋ ˆ๋“œ์—์„œ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

์Šค๋ ˆ๋“œ ์ƒ์„ฑํ•˜๊ธฐ 2

  1. Runnable ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉํ•˜๊ธฐ

Runnable ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ž๋ฐ”์—์„œ ์Šค๋ ˆ๋“œ๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์ •์˜ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” run ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ๊ทธ ์•ˆ์— ์‹ค์ œ๋กœ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์ž‘์„ฑํ•œ๋‹ค.

class DDungpiEat implements Runnable {
// ๋šฑ์ด 1์‹œ๊ฐ„ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œํ•œ์˜ ์Œ์‹ ์–‘ 
	long minFood;
	
	DDungpiEat(long minFood) {
		this.minFood = minFood
		}
	
	public void run() {
	// ๋šฑ์ด ํ•˜๋ฃจ์— ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์Œ์‹์–‘์„ ๊ตฌํ•˜๊ณ ,
	//  1์‹œ๊ฐ„์— ๋จน์„ ์ˆ˜ ์žˆ๋Š” ์Œ์‹์–‘์„ ๊ณ„์‚ฐํ•œ๋‹ค.
	}
	}
  1. ์Šค๋ ˆ๋“œ ์‹œ์ž‘ํ•˜๊ธฐ
  • DDungpiEat ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ์Šค๋ ˆ๋“œ๋กœ ์‹คํ–‰ํ•ด๋ณด์ž
  • new Thread(ddungpiEat) : DDungpiEat ๊ฐ์ฒด๋ฅผ Thread์— ๋„˜๊ฒจ์ฃผ๋ฉด์„œ ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค.
  • t.start() : ์Šค๋ ˆ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด DDungpiEat ํด๋ž˜์Šค์˜ run() ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
DDungpiEat ddungpiEat = new DDungpiEat(2000);
Thread t = new Thread(ddungpiEat); 
t.start()

 

์Šค๋ ˆ๋“œ์˜ ์ด๋ฆ„

์ž๋ฐ”์—์„œ ์Šค๋ ˆ๋“œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ฑฐ๋‚˜ ์‹๋ณ„ํ•  ๋Œ€ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šค๋ ˆ๋“œ ์ด๋ฆ„ ์„ค์ •ํ•˜๊ธฐ

Thread t1 = new Thread(new DDungpiEat(2000), "DDungpi");
t1.start()

DDungpi ๋ผ๋Š” ์Šค๋ ˆ๋“œ ์ด๋ฆ„ ์ง€์ •

์ž๋ฐ”์—์„œ๋Š” ํŠน์ • ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž์— null ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠนํžˆ ์Šค๋ ˆ๋“œ์™€ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž์— null ์„ ์ „๋‹ฌํ•˜๋ฉด NullPointerException๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

728x90