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

안드로이드 ThreadPoolExecutor? 사용법?

0 추천
asyncTask에사 가끔 RejectedExecutionException 발생합니다

찾아보니 너무 많은 쓰레드가 동시에 생성되면 그렇다고 해서 방법을 찾아보니

ThreadPoolExecutor 를 사용하면 된다고 하는데 정확한 사용법을 모르겠습니다

BlockingQueue workQueue; // gloval var

cursor = db.rawQuery("SELECT cable, title, bimg, _id FROM " + listDb, null);
while(cursor.moveToNext())
{
    String dbCable = cursor.getString(0);
    String dbTitle = cursor.getString(1);
    String dbImg = cursor.getString(2);
    int dbId = cursor.getInt(3);

    //new AppTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,dbCable, dbTitle,dbImg,String.valueOf(alignOrder), String.valueOf(dbId));

    ThreadPoolExecutor executor = new ThreadPoolExecutor(
            5,       // Initial pool size
            128,       // Max pool size
            1, // KEEP_ALIVE_TIME
            TimeUnit.SECONDS, //  KEEP_ALIVE_TIME_UNIT
            workQueue);

    new AppTask().executeOnExecutor(executor,dbCable, dbTitle,dbImg,String.valueOf(alignOrder), String.valueOf(dbId));*/
}
또는

executor.execute(new Runnable()
{
    @Override
    public void run()
    {
        new AppTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,dbCable, dbTitle,dbImg,String.valueOf(alignOrder), String.valueOf(dbId));
    }
});
이렇게 사용했는데 맞는건가요?(일단 동작은 됩니다)

제 폰에서 에러가 재현되면 고쳐졌는지 확인을 해볼텐데 제가 가진 폰들에서는 에러 재현이 안되서

제대로 사용했는지 궁금하네요 감사합니다
siinwho (320 포인트) 님이 2020년 1월 9일 질문

1개의 답변

+1 추천
 
채택된 답변

AsyncTask 자체가 ThreadPoolExecutor를 사용하고 있기 때문에 위 수정한 코드는 의미가 없어 보입니다. 혹시, 제가 만든 라이브러리가 있는데 한번 살펴보세요..

https://github.com/mcsong/AdvancedAsyncTask 

그리고, RejectedExecutionException 은 task queue가 꽉 차서 발생한 에러라서.. https://github.com/mcsong/AdvancedAsyncTask/blob/master/library/src/main/java/net/sjava/advancedasynctask/AdvancedThreadPoolExecutorFactory.java

코드를 보시면 제가 어떻게 RejectedExecutionException 을 discard하고 있는지 확인하실 수 있습니다.. 

mcsong (44,040 포인트) 님이 2020년 1월 12일 답변
siinwho님이 2020년 1월 12일 채택됨
우와 정말 너무 너무 감사합니다^^
...