Louie NRT Story

[안드로이드] Thread 생성하기 본문

전기차충전기

[안드로이드] Thread 생성하기

hyeok0724.kim@gmail.com 2021. 11. 23. 20:18
반응형

작성일: 11월 23일

 

Index

1. Thread 생성하기

2. Log 확인하기

3. 주저리주저리

 

 

1. Thread 생성하기

1) ThreadTest01에 대해서 설정하고자 하는 Thread 이름을 Parameter로 입력함

2) Thread Start 버튼과 Stop 버튼을 생성하고 이벤트 처리함

3) Start 버튼을 누르면 Thread가 존재하는지 확인하고 Thread.start 시작됨

※ 전역변수로 t1을 생성해 놓지 않으면 t1.isAlive()에서 에러 발생함

4) Stop 버튼을 누르면 Interrupt에 의해 Thread가 종료됨

5) Thread는 종료되면 null로 변하기 때문에 다시 new를 이용하여 생성해주어야함

ThreadTest01 t1 = new ThreadTest01("NameThreadTest01");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        OnClickListener m_onClickListener = new OnClickListener() ;

        Button btn_01 = (Button)findViewById(R.id.start);
        btn_01.setOnClickListener(m_onClickListener);
        Button btn_02 = (Button)findViewById(R.id.stop);
        btn_02.setOnClickListener(m_onClickListener);
    }

    private class OnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.start:
                    Log.d("OnClickListener", "Press Button");
                        if (!(t1.isAlive())) {
                            Log.d("OnClickListener", "Thread Start");
                            t1 = new ThreadTest01("NameThreadTest02");
                            t1.start();
                        }
                    break;
                case R.id.stop:
                    Log.d("OnClickListener", "Press Button2");
                    Log.d("OnClickListener", "Thread Stop");
                    t1.interrupt();
                    break;
            }
        }
    }

    public class ThreadTest01 extends Thread{
        public ThreadTest01(String thread_name){
            setName(thread_name);
        }

        @Override
        public void run() {
            super.run();
            try{
                while(!isInterrupted()) {
                    Log.d("Thread", getName() + " Thread is Running");
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                Log.e("Thread", getName() + " Thread Interrupted");
            } finally {
                Log.d("Thread", getName() + " Thread is Stop");
            }
        }
    }

 

 

2. Log 확인하기

 - 구성한 버튼은 다음과 같음

- Start 버튼을 누르면 버튼을 눌렀다는 로그와 NameThreadTest02 라는 이름의 Thread가 시작됨

- Stop 버튼을 누르면 Interrupted에 의해서 Exception으로 빠지고 Thread가 종료됨

 

 

3. 주저리주저리

- Thread를 만드는 방법으로 간단하게 Interrupt를 대신해서 Flag를 둠으로써 Thread를 시작 및 종료 할수 있음

- 단점으로는 Thread가 모든 동작을 수행되어 다시 While()로 돌아갈때까지 Thread를 종료 시킬수 없음

- Interrupt를 이용하면 Thread 동작 도중에 Exception을 발생시키면서 Thread를 종료 시킬 수 있음

private class ExampleThread extends Thread{
        private boolean thread_flag;

        public ExampleThread(int i){
            Log.d(LOG_TAG, "ExampleThread() -> INIT");
            thread_flag = true;
        }

        public void thread_stop() {
            this.thread_flag = false;
        }

        @Override
        public void run(){
            super.run();
            while(thread_flag) {
                try{
                    // 메시지 얻어오기
                    /*Message message = myHandler.obtainMessage();
                    message.what = SEND_MSG_01;
                    message.arg1 = 1;
                    String information = new String("초 째 Thread 동작 중입니다.");
                    message.obj = information;
                    myHandler.sendMessage(message);*/

                    Log.d(LOG_TAG, "ExampleThread() -> RUN_START");
                    Thread.sleep(2000);
                    Log.d(LOG_TAG, "ExampleThread() -> RUN_STOP");
                } catch (InterruptedException e) {
                    Log.e(LOG_TAG, "ExampleThread() -> EXCEPTION");
                    /*Message message = myHandler.obtainMessage();
                    message.what = SEND_MSG_02;
                    message.arg1 = 2;
                    String information = new String("초 째 Thread 동작 중입니다.");
                    message.obj = information;
                    myHandler.sendMessage(message);*/
                }
            }
            Log.d(LOG_TAG, "ExampleThread() -> STOP");
            this.thread_flag = true;
        }
    }

 

반응형
Comments