게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
[자바(안드로이드)] 무한루프의 스레드 중지시점
게시물ID : programmer_21566짧은주소 복사하기
작성자 : 법-규
추천 : 0
조회수 : 1014회
댓글수 : 2개
등록시간 : 2017/10/25 15:08:28
옵션
  • 본인삭제금지
불루투스를 통해 인풋스트림을 열어 read하는 스레드입니다.
대략 아래와 같이 구성되어 있습니다

try{
Inputstream Input = 블루투스소켓에서 getInputstream();
...
while (!Thread.currentThread().isInterrupted()) {
if(Input.available() > 0){
cycle...
}else{
Thread.sleep(1000);
}
}
}catch (IOException ex){
}catch (InterruptedException e) {
}finally{
Input.close();
}

해당 쓰레드의 인터럽트는 제가 블루투스 통신을 끊을때 다음과 같이 호출합니다.

if (쓰레드변수 != null) {
if (쓰레드변수.isAlive()) {
쓰레드변수.interrupt();
쓰레드변수 = null;
}
}
블루투스 소켓 close();

블루투스 통신을 다시 붙일때도 위와 같은 if문으로 확인하고요.

이상 없을거라고 생각했는데, 앱을 돌리다보면 간혹 페이탈이 뜨더라구요.
로그캣과 제가찍은 로그 분석해보니

블루투스 연결이 해제되었는데 
스레드가 제때 종료되지 않고 
인풋스트림을 참조한것 같습니다.

제가 이해가 안가는건, 

1. while문 인터럽트 검사
-> 2. if문에서 인풋스트림 available 메소드를 호출
-> 3. 인풋스트림 read 메소드를 호출
-> 4. 이 후 데이터 처리 사이클(인풋스트림 참조 없음)

위와 같은 방식에서
블루투스 통신을 해제하는 순서는 저 위에 있는것처럼 인터럽트 후에 소켓을 닫습니다.
그런데 1에서 인터럽트 조건은 통과하고, 
2와 3에서 인풋스트림이 참조될 수 없는게(블루투스 소켓이 close) 일어난건가요?

이런 경우 어떤 방향으로 해결을 해야할지도 조언 부탁드립니다.
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호