마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

쓰레드를 정지하고나서 다시 재시작

0 추천
class chatThread extends Thread {
        boolean run = true;
        public void run() {
            try {
                while (run) {
                    String msgs;
                    Message msg = new Message();
                    msgs = streamIn.readLine();
                    msg.obj = msgs;
                    mHandler.sendMessage(msg);
                }
            }catch(Exception e) {
            }
        }
        public void setRun(boolean run){
            this.run=run;
        }
        public boolean getRun(){
            return this.run;
        }
    }

제 스레드 코드입니다.

이걸 멈추기위해서 setRun(false) 해주면 멈추긴 하는데

다시 시작하려고 setRun(true) 해줘도 run함수내의 코드가 작동을 안하네요

while문을 빠져나와버려서 그런거같은데 run함수는 start 해놓고 따로 interrupt 안하는이상 계속 돌아가고 있는것 아닌가요?

혹시나해서 getRun해서 현재 run값 찍어보면 의도한대로 제대로 나오는데

저런식으로 멈춘 쓰레드를 다시 돌리는법이 궁금합니다.

안드잘하고싶 (3,310 포인트) 님이 2016년 4월 27일 질문

1개의 답변

0 추천
말씀하신 형태는 스레드가 종료하게 됩니다. 흐름을 타고 내려 왔으니 종료하는 것이 정상이지요.. 결론적으로 다시 시작한다는 것은 처음 실행하는 것과 동일합니다. 위에서 멈춘게 아니라 종료된 상태입니다.
mcsong (44,040 포인트) 님이 2016년 4월 27일 답변
아 한가지만 더 여쭤봐도 될까요 ㅠ
제가 저쓰레드를 컨트롤하는 인터페이스를 구현했는데
@Override
    public void switchThread(){
        boolean run = cThread.getRun();
        if(run) {
            cThread.setRun(false);
            fr=new FileReceiver(cSocket);
            fr.start();
        }else {
            fr.setRun(false);
            cThread=new chatThread();
            cThread.start();
        }
    }

이렇게 되어있습니다.
하지만 멈추는건 잘되는데 다시 시작하려고 하니까 계속 안됫다가 어쩌다가 되고그러는데 제 사용법이 틀린건가요?
이게 사용하시는 코드면 몬가 좀 이상하네요.. new chatThread(); 이런게 먹는다는건 자마린 같은 걸로 개발을 하시나요? 개인적으로는 안드로이드 스튜디오를 추천합니다..

본론으로, 위 스레드에서 streamIn.readLine();은 블럭 되는 거죠? 메서드만 보면.. IO이고 기본이 블럭이니..  데이터를 읽어야 처리가 되니.. setRun을 false로 해도 스레드는 아직 살아있는 상태입니다. readLine()에 데이터가 들어오면.. 그때서야 스레드가 종료하겠죠.. 그럼.. 답변에 올려주신 코드는 로직상.. 또 하나의 스레드가 readLine()을 하는 상황이 될 가능성이 높아 보입니다. 그래서 어떤때는 된다는게 2개의 스레드가 동일 IO를 읽을려고 하는 상황이라서 발생하는것으로 보입니다.
으아...안드로이드 스튜디오로 개발중인데
제가 지금 평소에는 문자만 주고받도록 chatThread가 돌아가다가
파일을 받을때는 저렇게 받을수가 없는데 파일이랑 그냥 문자랑 쓰레드내에서 어떻게 구별을 해야될지 몰라서 따로 쓰레드를 돌리는걸로 생각을 하고있습니다.
그런데 생각이랑 다르게 블럭이 자꾸 걸려서 잘 안되네요..
위 소스의 run()에서 종료가 되는지 확인을 하려고
 public void run() {
            try {
                while (run) {
                    String msgs;
                    Message msg = new Message();
                    msgs = streamIn.readLine();
                    msg.obj = msgs;
                    mHandler.sendMessage(msg);
                }
            }catch(Exception e) {
            }
         Log.d("end","chatThread end");
        }

이렇게 while문을 빠져나오는순간 로그를 찍도록 해봤는데
제 생각이랑 다르게 그 뒤에 뭔가를 하나 더 받고나서 종료가 되던데
그게 블럭이 되어있어서 그런거였네요 ㅠ
그러면 제가 생각대로 원하는 타이밍에 쓰레드를 멈추고
다른 쓰레드를 쓴다던가
아니면 하나의 쓰레드 내에서 파일이랑 문자를 구별해서 하는 방법은 없을까요?
이런거 처음해보는데 생각보다 복잡하네요 ㅠㅠ
그리고 저게 먹히는게 이상하다고 하셨는데
저런식으로 쓰레드를 다루니까
chatThread에서 문자를 받을때 처음 쓰레드가 시작될때랑은 다르게
뭔가가 누락이 된다거나 따로 온다거나 그런게 있는것 같아요
요런 상황이면.. 한 스레드로 처리하려면 문자 또는 파일 입력을 구분하셔야 합니다.. 입력이 어떻게 되는지 몰라서 명확하게는 말씀드릴 수는 없고요.. 또는 문자 입력과 파일 입력이 구분(stream 구분)할 수 있다면 별도 스레드로 처리하면 됩니다.
...