안드로이드 ThreadPoolExecutor? 사용법?

조회수 763회

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));
    }
});

이렇게 사용했는데 맞는건가요?(일단 동작은 됩니다)

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

제대로 사용했는지 궁금하네요 감사합니다

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 쓰레드풀이란 쓰레드 생성에 오버헤드가 있으므로 쓰레드를 미리 만들어놓고 요청시 반환하겠다는 겁니다. 즉 요청이 많은 서버에서 주로 가용성을 위해 사용하는 방법중 하나 입니다. 안드로이드 폰에서 사용할일은 없을 듯 싶습니다만 async 요청시 예외가 발생하는 것을 수정하는 것이 맞을 듯 합니다. 그리고 질문상의 코드에서 ThreadPoolExecutor 을 반복적으로 생성하는 것이 아닙니다. pool은 하나만 만들고 그 pool안의 쓰레드를 사용하는 겁니다. 정영훈 2020.1.9 16:44
  • 감사합니다 RejectedExecutionException 에러때문에 찾아보니 ThreadPoolExecutor 쓰라고 해서요 동시에 50개가 넘는 aysncTask를 실행할때도 있는데 이럴땐 어떻게 해야 될까요? 구조는 바꿀수 없는 상황입니다 알 수 없는 사용자 2020.1.10 13:21
  • 안드로이드에서 동시에 50개씩 쓰레드를 만든다는 것이 이상한겁니다...이상한 것은 이상한 것이고...쓰레드풀은 한번만 많이 만들고 그것을 재활용하는 것입니다. 그렇게 코딩해야 합니다. 코드를 일부만 볼 수 있는 상황에선 3자가 뭘 해줄 수 있는 상황은 안될 것 같고 쓰레드풀이라는 것을 천천히 학습해 보세요. 정영훈 2020.1.10 15:01
  • 네 조언 너무 감사합니다^^ 알 수 없는 사용자 2020.1.10 16:33

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)