2013-08-14 2 views
1

내 Android 구성 요소 중 하나에서 Java ThreadPoolExecutor를 사용하고 있습니다. 내 질문은 :일부 작업을 실행 한 후 ThreadPoolExecutor에 대한 사용자 지정 RejectedExecutionHandler를 설정 하시겠습니까?

TPE에 일부 작업을 실행 한 후 setRejectedExecutionHandler()를 사용하여 RejectedExecutionHandler를 설정하는 것이 좋습니다.

나는이 일을하는 부작용이 있음을 의미합니다. 좋은 습관입니까?

편집

내가 다른 프로젝트에서 사용할 수있는 안드로이드에 ThreadPoolManagementLibrary 프로젝트를 만드는 데 필요한입니다. 이제, 필자는 내 구성 요소에 TPE의 공용 메소드를 공개해야합니다. 사용자가 RejectedExecutionHandler를 설정하게하면 문제가 발생합니까?

+0

왜 그렇게하고 싶습니까? 거부 정책이 명확하고 안정적이어야한다고 생각합니다. – assylias

+0

@assylias이 (가) 질문을 편집했습니다. – LazyTechie

답변

2

나는 그렇게 생각하지 않는다. RejectedExecutionHandler가 수행하는 작업을 이해하려고합니다. 다음 이벤트의 순서 다음

당신이있는 ThreadPoolExecutor에 작업을 제출 제출

이 발생합니다

  • 을 무료이며이 작업을 실행할 수 있습니다 무료로 모든 작업자 스레드가있는 경우.
  • 그렇지 않으면 작업자 스레드가 자유로운 경우 작업을 처리 할 작업 큐에서이 작업을 이동하려고 시도합니다.
  • workerQueue도 가득 찬 경우 작업 스레드가 maxPoolSize 미만인 가능한 한 새 스레드를 작성하려고 시도합니다.
  • 위와 같은 작업이 모두 실패하면 작업이 처리기로 보내지고 기본 처리기가 RejectedExecutionException을 발생시킵니다.

기본적으로 사용자가 자신의 처리기를 설정할 수 있도록 허용하면 거부 된 작업을 자신의 방식으로 처리 할 수있는 자유가 부여됩니다. 그들은 그것을 구현하는 동안 조심해야합니다.

3

"RejectedExecutionException을 처리해야합니까?" 그 대답은 물론 그렇습니다. 그렇게하지 않으면 스레드가 실행되는 스레드, 즉 실행을 위해 작업을 제출하는 스레드가 충돌하고 응용 프로그램이 알 수없는 상태로 계속 실행됩니다.

두 번째 질문은 "이 예외를 처리하기 위해 우리는 어떻게해야합니까?"입니다. 아마 우리는 가능한 한 깨끗하게 응용 프로그램을 중단해야합니다. 다른 런타임 예외 (및 오류)에도 해당되므로 UncaughtExceptionHandler를 사용하는 것이 하나의 솔루션입니다. 그러나 RejectedExecutionException을 특정 방식으로 처리하려는 경우 RejectedExecutionHandler를 사용할 수 있습니다. 이것은 어플리케이션을 정지시키기 전에 (UncaughtExceptionHandler에 의해 캐치되는 새로운 RuntimeException를 Throw하는 것으로), 특정의 처리를 실시하기 위해서 사용할 수 있습니다.

여기서 핵심은 모든 예외와 오류를 처리해야한다는 것입니다. 이것은 "모범 사례"라고 불리기는하지만 이러한 관행은 잘못되었습니다. 단일 스레드 응용 프로그램에 한 번 적용되었습니다. 세상이 바뀌 었습니다. 런타임 예외 또는 오류로 인해 응용 프로그램이 아닌 스레드가 충돌합니다. 따라서 반드시 처리해야합니다.

물론 프레임 워크 또는 응용 프로그램 서버를 사용하는 경우이 서버 또는 프레임 워크가 아마도 캐치되지 않은 예외를 처리하기 때문에 문제가 다를 수 있습니다.

0

@ user2120553도 동의합니다. 언급 된 모든 포인트 @Braj Kishore는 정확하지만, 우리가 우리의 커스텀을 선언한다면 RejectedExecutionHandler 우리는 반드시 실행을 재 시도 할 수있는 기회를 갖게 될 것이라고 언급하고 싶습니다.

관련 문제