[Android] Thread와 BlockingQueue에 대한 삽질기록

2019. 6. 28. 18:04Programming/Android

반응형

프로그램을 작성하다보면 여러개의 작업을 병렬로 처리해야 할 경우가 있다. 네트워크를 통해 영상 데이터를 전송받아서, 디코딩한 후 재생하는 경우가 대표적이다. 아무튼 이번에는 BlockingQueue를 사용한 코드를 수정하다가, 몹시 곤혹스러운 상황을 맞딱드리게되서 기록을 남기려고 한다.

 

Thread.wait()이나 Thread.sleep()을 호출하지 않는데도 Thread의 상태가 WAIT으로 변경되고, notify()notifyAll(), Thread.start()를 호출하지 않아도 Thread의 상태가 RUNNING으로 변경된다. 내가 작성한 코드라면 금방 단서를 찾을 수 있거나 혹은 이런 경험이 있다면 원인을 찾기 좀 쉬울 것 같은데, 심지어 Thread의 상태를 검색해보면 위에서 언급한 메서드들만 나올 뿐이다. 대체 어떻게 해야할까.

 

Thread라고는 끽해봐야 nginx를 사용한 백엔드 환경에서 비동기식으로 동작하는 API를 작성하던 나로써는, 도무지 이해를 할 수 없는 현상이었다. 아무도 멈추질 않는데 Thead가 저절로 잠들고, 아무도 깨우질 않는데 저절로 일어나다니. 그럴리가 없다면서 start(), wait(), notify() 등의 메서드마다 전부 브레이크 포인트를 걸어봤지만, 어느 브레이크 포인트도 동작하지 않았다.

이런저런 시도 끝에 BlockingQueue.take()를 호출하는데, 다른 Thread가 이 BlockingQueue에 데이터를 넣어주지 않는 경우 스레드가 저절로 멈추는 것이었다. BlockingQueue, AndroidDevelopers 페이지를 참조하도록 하자.

 

A Queue that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element.

BlockingQueue methods come in four forms, with different ways of handling operations that cannot be satisfied immediately, but may be satisfied at some point in the future: one throws an exception, the second returns a special value (either null or false, depending on the operation), the third blocks the current thread indefinitely until the operation can succeed, and the fourth blocks for only a given maximum time limit before giving up. These methods are summarized in the following table:

 

BlockingQueue는 호출하는 메서드에따라, 네 가지 방법으로 처리가 된다. 예를 들어서 BlockingQueue.add(e)를 호출하는 경우에는 Exception을 발생시키고, BlockingQueue.take()를 호출하는 경우에는 Thread를 블럭시킨다. 나의 경우에는 스트리밍된 데이터를 BlockingQueue에 저장한 후 BlockingQueue.take()를 호출해서 한 프레임씩 가져가기때문에, BlockingQueue가 비어있을때는 Thread가 블럭됐던 것이다. 그러니 Thread.run()이나 Thread.wait()마다 브레이크 포인트를 걸어도, 당최 잡을수가 없을수밖에.

 

그러니 BlockingQueue를 사용할 때는 후임자를 위해, 적절히 주석을 달아놓도록 하자. ' ㅈ')


참조:
안드로이드 스레드(Android Thread), 개발자를 위한 레시피
BlockingQueue, AndroidDevelopers
Java Object 클래스의 wait과 notify의 사용법, Hapiness On Code

불러오는 중입니다...

반응형