2009-06-13 3 views
7

사용자가 필터링 할 이미지를 요청하면 새 스레드를 생성하는 응용 프로그램이 있습니다.간단한 스레드 관리 - Java - Android

이것은 내가 가지고있는 유일한 유형의 작업이며 모든 것이 똑같이 중요합니다.

너무 많은 동시 스레드 (최대 9 개까지)를 요청하면 스레드 관리자는 RejectedExecutionException을 발생시킵니다.

내가하는 일은 분당합니다.

// Manage Concurrent Tasks 
private Queue<AsyncTask<Bitmap,Integer,Integer>> tasks = new LinkedList<AsyncTask<Bitmap,Integer,Integer>>(); 

@Override 
public int remainingSize() { 
    return tasks.size(); 
} 

@Override 
public void addTask(AsyncTask<Bitmap, Integer, Integer> task) { 
    try{ 
     task.execute(currentThumbnail); 
     while(!tasks.isEmpty()){ 
      task = tasks.remove(); 
      task.execute(currentThumbnail); 
     } 
    } catch (RejectedExecutionException r){ 
     Log.i(TAG,"Caught RejectedExecutionException Exception - Adding task to Queue"); 
     tasks.add(task); 
    } 
} 

은 단순히 큐에 거부 작업을 추가하고 스레드가 큐를 다시 시작하면 백 로그가 있는지 확인합니다.

명백한 문제는 최종 작업이 첫 번째 시도에서 거부되면 더 이상 필요하지 않을 때까지 다시 시작되지 않는다는 것입니다.

단순한 모델이 있는지 궁금해서 이런 종류의 관리에 사용해야합니다. 완료 될 때 대기열에 알리기위한 작업이 필요하므로 공간이 있다는 것을 알지만 어떻게해야할지 모르겠습니다. 당신이 당신의 구현을 수정 도움이 될 수 있습니다 주제에 많은 도움이 기사에 대한 위키 피 디아 문서 포인트 -

종류와 관련,

개빈

답변

12

의 이유는 AsyncTask이 자체 스레드 풀 (Martelli의 답변에 따라)을 구현하기 때문이며 최대 10 개의 동시 작업으로 제한됩니다. 왜 그들이 그 한계를 가지고 있는지 모르겠다.

따라서 하나의 가능성은 AsyncTask을 복제하고 제한을 늘리거나 (LinkedBlockingQueue으로 가능) 무제한으로 만들고 복제본을 사용하십시오. 그런 다음 변경 사항을 향후 Android 버전 용으로 AsyncTask에 대한 패치로 제출하십시오.

Google 코드 검색 AsyncTask을 실행하려면 here을 클릭하십시오. 첫 번째 히트가 구현되어야합니다.

한계를 높이려면 MAXIMUM_POOL_SIZE을 필요한만큼 크게 조정하십시오. 무제한으로 가고 싶다면, 현재 사용중인 것 대신 0- 인수 LinkedBlockingQueue 생성자를 사용하십시오. AFAICT는 코드의 나머지 부분을 그대로 유지합니다.

+15

한계는 더 이상 10이 아닙니다. AsyncTasks가 12 개가 해고 될 의도가 없으므로 제한이 적용되었습니다. 이러한 작업의 목표는 UI를 업데이트하는 것이므로 업데이트를 유발하는 수십 개의 스레드를 갖는 것은 매우 끔찍합니다. –

+0

한계는 현재 http://google.com/codesearch#uX1GffpyOZk/core/java/android/os/AsyncTask.java에 따라 5 병렬 스레드입니다. –

+0

@Grantland Chew : 아니요, 5 번부터 시작하겠습니다. 그것은 그 이상으로 성장할 수 있습니다. – CommonsWare

0

비트 맵을 매개 변수로 사용하는 대신 차단 대기열에서 작업을 대기시키지 만 작업을 종료 할 방법을 추가해야 할 수도 있습니다.