๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค2024 ์•ˆ๋“œ๋กœ์ด๋“œ/โ˜€๏ธ ํ•˜๊ณ„ ์ธํ„ด ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ ๊ธฐ๋ก

Android Thread

by hyeonha 2024. 8. 19.

๋ชฉ์ฐจ

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

    ์Šค๋ ˆ๋“œ

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

    ์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ (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