콘텐츠로 건너뛰기

JAVA 39일차 (20230717) 자바 프로그래밍_스레드 풀 사용법

JAVA 39일차 (20230717) 자바 프로그래밍_스레드 풀 사용법

newCachedThreadPool


join joinlong milliSecon
join joinlong milliSecon

join joinlong milliSecon

join 메서드는 특정 스레드가 작업하는 동안에 자신을 일시 정지 상태로 전환하는 메서드입니다. 즉, 다른 스레드의 작업이 끝날 때까지 기다린다.

join() 메서드는 인자로 밀리초 단위로 전달할 수 있으며, 전달한 인자만큼의 시간이 경과하거나 interrupt() 메서드가 호출되거나, join() 호출 시 지정했던 다른 스레드가 모든 처리를 마치면 다시 실행 대기 상태로 복귀합니다.

interrupt
interrupt

interrupt

interrupt 메서드는 일시 중지 상태인 스레드를 실행 대기 상태로 복귀시킨다. sleep, wait, join 메서드에 의해 일시 정지된 스레드들은 각 해당 메서드에서 정지합니다. 그러므로 정지 중인 스레드가 아닌 다른 스레드에서 정지스레드.interrupt를 호출하여 정지 상태를 실행 대기 상태로 전환할 수 있어요. interrupt 메서드로 인해 실행 강제 상태로 전환됩니다.

마지막으로 정지 상태 해제 메모를 출력한 후 종료되어 TERMINATE소멸 상태가 됩니다.

스레드 적용. 스레드 간 통신 적용하기.
스레드 적용. 스레드 간 통신 적용하기.

스레드 적용. 스레드 간 통신 적용하기.

앞서 작성한 코드를 통해, 안드로이드 메인 스레드가 아닌 스레드에서 뷰View에 대한 직접적인 접근의 문제에 관하여 살펴보았습니다. 다행히도, 그리고 친절하게도, 안드로이드 프레임워크에서 해당 문제에 대한 에러 메모를 띄워준 덕분에 문제점을 쉽게 찾을 수 있었죠. 사안을 해결하기 위한 방법은 여러가지가 있지만, 여기서는 가장 일반적인 접근 방법, 스레드 간 통신을 적용하겠습니다. 스레드 간 통신의 핵심은 간단합니다.

하나의 스레드에서 다른 스레드로 메모를 보내는 것입니다. 예제에서는, 새로 만든 스레드1초 마다. 메시지 전달에서 메인 스레드현재 시각 화면에 표시로 메모를 보내면 됩니다.

2 구현. 스레드 없이 무작정 만들어보기.

원인을 찾기 위해, 한 가지 질문을 던져보겠습니다. 일반적으로, 개발자가 안드로이드 앱의 초기화 코드를 작성하는 메서드인 onCreate 메서드는어디서 호출, 실행되는 것일까요?

onCreate 메서드가, 안드로이드 스튜디오에서 액티비티를 추가할 때 자동으로 추가되고, 앱이 실행된 다음 액티비티가 만들어지는 시점에 무조건 호출되는 메서드라는 것은 모호하게 알고 있지만, 프레임워크 내부에서 onCreate 메서드가 어떤 과정을 거쳐 호출되는지에 대해서는 큰 주목을 가지지 않았을 것입니다.

하지만 를 미리 살펴보고 내용을 이해했다면, onCreate가 어떠한 이벤트 메시지가 수신되었을 때 실행되는 메서드이고, 안드로이드 앱의 메인 스레드에서 실행된다는 것을 어렴풋이 눈치챌 수 있을 것입니다.

스레드 사용. 일단 스레드로 만들어보기.

앞서 작성한 코드의 문제는, 지속적으로 실행되어야 하는 처리를 메인 스레드onCreate에서 실행했기 때문에, 메인 스레드의 다른 코드가 더 이상 실행되지 않는 것이었습니다. 이용자 입력도 처리하지 못하고, 디스플레이 갱신도 수행하지 못하게 되어버렸죠.

그럼 이제 메인 스레드와 분리되어 동시적으로(Concurrently) 실행되어야 하는 작업(1초 마다. 현재 시각 표시)을 다른 스레드로 작성해보겠습니다.

sleeplong milliSecon

sleep 메서드는 Thread의 클래스 메서드로 인자에 입력한 수의 milliSecond 동안 스레드를 멈춘다. 1000 milliSecond 동안 스레드 일시 정지Thread.sleep1000

sleep 메서드를 실행하면 실행한 스레드의 상태는 일시 정지 상태로 전환되며, 인자로 전달한 시간이 경과하거나, interrupt 메서드를 호출한 경우에 다시 실행 대기 상태로 복귀합니다.

3 실행 결과. 스레드 간 통신 적용하기.

자, 이제 드디어 요구하는 기능이 동작되도록 만들었습니다. 의 스레드에 대한 일반적인 설명에 이어, 이 글에서는 다소 억지스런? 예제를 통해 스레드를 사용하는 이유와 사용법, 그리고 몇 가지 주의 사항에 관하여 살펴보았습니다. 간결하게 요약하자면, 메인 스레드와 병행적으로Concurrently 실행되어야 할 작업은 스레드로 작성합니다. 메인 스레드에서는 실행 시간 혹은 대기 시간이 긴 작업의 실행을 피해야 합니다.

UI를 변경하는 작업은 무조건적으로 메인 스레드에서 실행되어야 합니다. 핸들러(Handler)를 사용하여 메인 스레드로 메모를 보낼 수 있어요.

자주 묻는 질문

join joinlong

join 메서드는 특정 스레드가 작업하는 동안에 자신을 일시 정지 상태로 전환하는 메서드입니다. 구체적인 내용은 본문을 참고 해주시기 바랍니다.

interrupt

interrupt 메서드는 일시 중지 상태인 스레드를 실행 대기 상태로 복귀시킨다. 궁금한 사항은 본문을 참고하시기 바랍니다.

스레드 적용. 스레드 간 통신

앞서 작성한 코드를 통해, 안드로이드 메인 스레드가 아닌 스레드에서 뷰View에 대한 직접적인 접근의 문제에 관하여 살펴보았습니다. 궁금한 사항은 본문을 참고하시기 바랍니다.