관리 메뉴

한글창제의 기쁨

ExecutorService / ThreadPoolExecutor 본문

분류없음

ExecutorService / ThreadPoolExecutor

timesurfer 공간지배자 2018.11.12 21:05

// 동시에 4개 실행 

ExecutorService executorService = Executors.newFixedThreadPool(4);



.newFixedThreadPool 시에 new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); 

과 같이 ThreadPoolExecutor을 생성한다.  개발 성격에 따라 맞는 성향의 Queue를 생성 할 수 있다. 




// 이미 시작된 Task는 실행 하고, 새로운 작업은 받지 않음

executorService.shutdown() 


// 작업이 완료되었는지 확인 , 작업이 완료된후 true 

executorService.isTerminated()  


// executorService.shutdown() 셧다운 요청이  있은 후에 true로 변경 된다.

executorService.isShutdown()    


// 지정된 시간에 작업이 완료되엇는지 체크 해준다. 

executorService.awaitTermination(1, TimeUnit.SECONDS) 





Task 종료 방법 


1. 특정 시간 단위로 작업이 끝날때 까지 종료 체크 , 특정 시간이 지나면 강제 종료 


executorService.shutdown() 


do {

  

  System.out.println("Running.... {}" + executorService.isTerminated());

  

  // 작업이 완료되었으면 즉시 정지 한다. 

  if (executorService.isTerminated()) {


    System.out.println("Running....2 {}" + executorService.isTerminated());

    executorService.shutdownNow();


  }

  

  // 새작업을 중지하고 모든 작업이 완료될때까지 지정된 동안 대기,  

  // 시간이 만료되면 즉지 중지 (작업시간이 60초를 넘어가면 즉시 강제 중지)

  if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {

    executorService.shutdownNow();

  }


  // 지정된 시간 별로(10초단위) 작업이 모든 작업이 중지되었는지 체크

} while (!executorService.awaitTermination(10, TimeUnit.SECONDS));




2. 특정 시간 단위로 작업이 끝날때 까지 종료 체크하며, 작업이 끝날때 까지 대기 

do {

      try {


      // 종료 요청이 있었는지 체크 

        if(!executorService.isShutdown()) {

         

          System.out.println("종료 요청");

         

          // 이미 시작된 Task는 실행 하고, 새로운 작업은 받지 않음

          executorService.shutdown();


        }

      } catch (Exception e ) {

        // 오류로 모든 Task 강제 종료

        executorService.shutdownNow();

      }


      // 지정된 시간 별로(10초단위) 작업이 모든 작업이 중지되었는지 체크

    } while (!executorService.awaitTermination(2, TimeUnit.SECONDS));






3. 오라클 문서에 권장된 종료 방법 

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html


void shutdownAndAwaitTermination(ExecutorService pool) {

   pool.shutdown(); // Disable new tasks from being submitted

   try {

     // Wait a while for existing tasks to terminate

     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {

       pool.shutdownNow(); // Cancel currently executing tasks

       // Wait a while for tasks to respond to being cancelled

       if (!pool.awaitTermination(60, TimeUnit.SECONDS))

           System.err.println("Pool did not terminate");

     }

   } catch (InterruptedException ie) {

     // (Re-)Cancel if current thread also interrupted

     pool.shutdownNow();

     // Preserve interrupt status

     Thread.currentThread().interrupt();

   }

}

0 Comments
댓글쓰기 폼