Thread์™€ Handler

๋ฐ•์Šนํ˜„ยท2022๋…„ 4์›” 28์ผ
0

๐Ÿค”Thread๋ž€?

ํ•œ ์‚ฌ๋žŒ์ด ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค
=๋ฉ€ํ‹ฐ ํƒœ์Šคํ‚น

ํ”„๋กœ์„ธ์Šค vs ์Šค๋ ˆ๋“œ
ํ”„๋กœ์„ธ์Šค: ๋…๋ฆฝ์ „ ๋‹จ์œ„, ์—ฐ์†์ ์œผ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ
๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…> ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค
์Šค๋ ˆ๋“œ: ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ๋‘˜ ์ด์ƒ์˜ ์ž‘์—…์„ ๋™์‹œ์— ์ง„ํ–‰ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ์ž‘์€ ๋‹จ์œ„
์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ํ•˜๋‚˜์˜ ์ปด์ด ์—ฌ๋Ÿฌ ์ž‘์—…

ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ๋™์ž‘

  • ์ƒ์ˆ˜
    onCreate ์•ˆ์— ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ์ƒ์„ฑ
    thread ์ƒ์†
    num ๋ฐ›์Œ
  • runnable(์ธํ„ฐํŽ˜์ด์Šค)
    run๋ฉ”์†Œ๋“œ ๋ฐ–์— ์—†์Œ > ๊ตฌํ˜„ํ•ด์„œ new Thread ์ƒ์„ฑ์ž ์•ˆ์— ๊ทธ ์•„๋ž˜ ? ๋‹ด์•„์ค˜์•ผ ์‹คํ–‰ ๊ฐ€๋Šฅ

1.์นด์šดํŠธ ์ž๋™ ? ์•ฑ
2.๊ฒŒ์ž„

โ‘  ์‹œ๊ฐ„์ฒดํฌ
โ‘ก ๋‘๋”์ฅ ์›€์ง์ด๊ธฐ

์œ„์— 0 ์ด ๋ˆŒ๋ €์„๋•Œ 1์”ฉ ์นด์šดํŠธ


์‹ค์Šต

(์‚ฌ์ง„)

๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์นด์šดํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์„ธ์–ด์ง€๊ฒŒ

1.๊ฐ์ฒด ์„ ์–ธ/์ดˆ๊ธฐํ™”
2.thread ์ƒ์† - run๋ฉ”์†Œ๋“œ - ๋กœ์ง ์ •์˜
3.thread ๊ฐ์ฒด ์ƒ์„ฑ
4.handler ๋งŒ๋“ค๊ธฐ - handleMessage์„ ์–ธ
4.msg.arg1์— ๊ฐ’ ๋„ฃ๊ธฐ - sendMessage(msg)๋กœ ์ „๋‹ฌ

1.mainActibity.xml

โ‘  ๊ฐ์ฒด ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”

TextView tvNumber;
Button btnStart;
tvNumber = findViewById(R.id.tvNumber);
btnStart = findViewById(R.id.btnStart);

โ‘ก extend Thread

    class TimerThread extends Thread{ //์Šค๋ ˆ๋“œ ์ƒ์†
        //run์„ ์˜ค๋ฒ„๋ผ์ด๋“œ
        public  void  run(){
            //์‹คํ–‰ํ•  ๋กœ์ง ์ •์˜
            //๋ฒ„ํŠผ ๋ˆŒ๋ €์„ ๋•Œ ์ž๋™ ์นด์šดํŠธ ๊ธฐ๋Šฅ
            //
            for(int i =0;i<10;i++){
                Log.d("TimerThread","์นด์šดํŠธ"+(i+1));
            }
        }
    }

โ‘ข

        //3 Thread ๊ฐ์ฒด ์ƒ์„ฑ
        TimerThread thread = new TimerThread();
        //์‹คํ–‰์‹œํ‚ค๋Š” ๋ฉ”์†Œ๋“œ start
        thread.start();

โ‘ฃ

                //4. 1์ดˆ
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

โ‘ค

                //5.id๋ณ€์ˆ˜ ๋„ฃ์–ด์ฃผ๋ฉด ์—ฌ๊ธฐ ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š” ์ƒํƒœ
                tvNumber.setText(String.valueOf(i+1));

mainThread์—์„œ๋งŒ ui์ž‘์—… ํ•  ์ˆ˜ ์žˆ๋‹ค.
subThread์—์„œ ui์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋ ค๋ฉด Handler๋ฅผ ์ด์šฉ

๐Ÿค”Handler๋ž€?

subThread์—์„œ ์ž‘์—…์„ ํ•˜๊ณ  ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธ ์‹œํ‚ค๊ณ ์‹ถ์€๋ฐ ๊ทธ ์ผ์€ main๋งŒ ๊ฐ€๋Šฅ
์ด๊ฑธ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด? main์— ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋„˜๊ฒจ์ค˜ ๋ฐ˜์˜์‹œ์ผœ์•ผํ•œ๋‹ค!
app์‹คํ–‰>mainT์ž๋™์‹คํ–‰,
main์—๋Š” messageQueue๋Š” ๋ฉ”์„ธ์ง€๋ผ๋Š” ๋‚ด์šฉ์„ ๋ฐ›์•˜์„ ๋•Œ, ์‹คํ–‰์‹œ์ผœ์ฃผ๋Š” ๊ฒƒ
sub์—์„œ message> handler> main์˜ queue ์•ˆ | > handler > subT

0.Handler ๋งŒ๋“ค๊ธฐ

        //8.ํ•ธ๋“ค๋Ÿฌ ์„ค์ •?
        TimerHandler handler = new TimerHandler();
                //7.Handler์˜ ๊ฐ’์„ ์ „๋‹ฌํ•ด์ค˜์•ผํ•œ๋‹ค -> Message๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ
                Message msg = new Message();
                msg.arg1 = i+1;
                //message๊ฐ์ฒด ์ „์†ก
                handler.sendMessage(msg);
                //๊ฐ’์„ ์–ด๋–ค ๋ณ€์ˆ˜์— ๋‹ด์•„์คฌ๋Š”๋ƒ ๊ธฐ์–ต!
                
    //ํ•ธ๋“ค๋Ÿฌ ๋งŒ๋“ค๊ธฐ
    class TimerHandler extends Handler{
        @Override
        public void handleMessage(@NonNull Message msg) {
            //ํ‹€ ๋งŒ๋“ค๊ธฐ ๋!
            //sub Thread์—์„œ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ  UI์—์„œ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ
            //HandlerMessage()์•ˆ์— ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.
            int count = msg.arg1;
            tvNumber.setText(String.valueOf(count)); //์ •์ˆ˜๋‹ˆ๊นŒ ๋ฐ”๋กœ ๋„ฃ์œผ๋ฉด x > String.valueof()

        }
    }


์ถ”๊ฐ€ ์‹ค์Šต

๋ฒ„ํŠผ ํด๋ฆญ์‹œ, ์ˆซ์ž ์˜ฌ๋ผ๊ฐ€๊ฒŒ?

0.๋ ˆ์ด์•„์›ƒ

1. thread2,Handler2 ๋งŒ๋“ค๊ธฐ

โ‘  onclick ๋ฉ”์„œ๋“œ

//์Šค๋ ˆ๋“œ ๊ฐ์ฒด ์‹คํ–‰
TimerHandler handler2 = new TimerHandler();
                
//๋ฒ„ํŠผ ๋น„ํ™œ์„ฑํ™”
btnStart.setEnabled(false);

2. ๊ธฐ๋Šฅ

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