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

ThreadPoolExecutor 을 앱이 종료할 때까지 계속 유지해도 문제 없을까요?

0 추천

앱 속도 개선을 위해서 스레드 쪽으로 알아보다가 ThreadPoolExecutor 를 알게 되었습니다. 앱 초기 로딩 과정에서 Executors.newFixedThreadPool(3) 를 호출, 3개의 스레드를 활용해 속도 개선을 이룬 상황이고요. 질문은 두 가지 입니다.

ExecutorService 의 shutdown() 을 호출하면 더이상 작업을 받지 않는다고 하던데 스레드도 반납을 해버려서 다시 작업을 하려면 Executors.newFixedThreadPool() 호출부터 시작해야 하는 상태인 건가요? 아니면 작업을 재개하는 다른 방법이 있는 것인지 질문드립니다. 그리고 다음의 질문은 첫 번째 질문의 답이 전자라고 가정하고 작성한 질문입니다.

스레드는 생성과 회수 단계에서 비용이 많이 발생해서 잘못 남용할 경우 오히려 느려질 수 있다고 하는데, 그렇다면 매번 필요할 때 마다 Executors.newFixedThreadPool(3) 호출해 작업 스레드를 새로 구성하지 않고, 애초에 클래스 변수로 선언하거나 액티비티 간에 전달 해주거나 하면서 앱 이쪽 저쪽에 사용해보려고 합니다. 앱 종료 시에 onDestroy()에서 shutdown() 하는 식으로요. 이런 방법에 발생할만한 문제가 있을까요? 권장할만한 방식인지 궁금합니다.

pigstoe (510 포인트) 님이 2023년 10월 31일 질문
pigstoe님이 2023년 10월 31일 수정

1개의 답변

+1 추천
 
채택된 답변
쓰레드는 한번 작업이 완료되면 재사용이 불가합니다.허지만 쓰레드풀은 쓰레드를 재사용하기 위한 용도이므로 가ㅣ좀 더 유연한 방법이 있을 것으로 보이는데, 한번 확인해 볼게요.
그리고 구현하신 앱 초기화는 workManager나 Jetpack에 앱초기화 라이브러리가 이미 존재하므로 검토해https://developer.android.com/topic/libraries/app-startup보시면 도움이 되실 것 같네요.
https://developer.android.com/topic/libraries/app-startup
spark (227,830 포인트) 님이 2023년 10월 31일 답변
pigstoe님이 2023년 10월 31일 채택됨
Submit 하고 나서 shutdown을 하실 필요는 없어 보입니다. Shutsown의 목적이 GC가 죽은 쓰레드들을 회수하게 하고 더 이상의 새로운 task가 실행되지 못하게 하는 것이기 때문에 안드로이드 라이프싸이클에만 안전하게 shutdown 해주시면 되지 않을까 생각합니다. 말씀하신대로 shutdown을 하시고 나면 말씀하신대로  executorservice를 다시 초기화해주셔야 할 것 같네요.
말씀하신 내용으로는 아직 시간을 단축할만한 여지가 더 있는 것 같아 희망적이네요. 시도해봐야겠습니다. WorkManager 라는 클래스도 같이 공부해봐야겠네요. 말씀 정말 감사합니다.
...