2016-10-15 5 views
4

나는 호출 가능한 인터페이스 병렬을 실행할 수있는 내 자신의 스레드 풀과 장래의 개체를 만들고 있습니다. Executor는 종료 메소드를 제공하여 모든 작업자 스레드가 실행되지 않도록합니다. 아래 스레드 풀을 만드는 경우 모든 스레드가 실행을 마친 후 어떻게 종료 방법을 구현해야합니까?executorService 종료 메서드를 재정의하는 방법

내 사용자 지정 스레드 풀 내가 스레드의 목록을 유지하는 방법을 생각하고 유휴 또는하지 않을 경우 다음 확인을 couldnt this

class MyThreadPool implements java.util.concurrent.Executor 
{ 
    private final java.util.concurrent.BlockingQueue<Callable> queue; 

    public MyThreadPool(int numThreads) { 
     queue = new java.util.concurrent.LinkedBlockingQueue<>(); 
     for (int i=0 ; i<numThreads ; i++) { 
      new Thread(new Runnable(){ 
       @Override 
       public void run() { 
        while(true) { 
         queue.take().call(); 
        } 
       } 
      }).start(); 
     } 
    } 

    @Override 
    public <T> Future<T> submit(Callable<T> callable) { 
    FutureTask<T> future = new FutureTask(callable); 
    queue.put(future); 
    return future; 
    } 

    public void shutdown(){ } 
} 

처럼 보인다?

답변

1

작성중인 스레드에 대한 참조가 있어야합니다. 예를 들어 threadsList<Thread> 유형의 필드를 설정하고 생성자 내에서이 목록에 스레드를 추가하십시오.

public void shutdown() { 
    for (Thread t : threads) { 
     try { 
      t.join(); 
     } catch (InterruptedException e) { /* NOP */ } 
    } 
} 

적절한 조건 while (true)을 대체하는 것을 잊지 마십시오 (당신이 shutdown()로 전환하는) 및 BlockingQueue#poll(long, TimeUnit)보다는 take()을 사용하는 것이 좋습니다 :

그 후, 당신은 Thread#join()의 도움으로 shutdown()을 구현할 수 있습니다.

편집 : 뭔가 같은 :

public class MyThreadPool implements Executor { 

    private List<Thread> threads = new ArrayList<>(); 
    private BlockingDeque<Callable> tasks = new LinkedBlockingDeque<>(); 
    private volatile boolean running = true; 

    public MyThreadPool(int numberOfThreads) { 
     for (int i = 0; i < numberOfThreads; i++) { 
      Thread t = new Thread(() -> { 
       while (running) { 
        try { 
         Callable c = tasks.poll(5L, TimeUnit.SECONDS); 
         if (c != null) { 
          c.call(); 
         } 
        } catch (Exception e) { /* NOP */ } 
       } 
      }); 
      t.start(); 
      threads.add(t); 
     } 
    } 

    public void shutdown() { 
     running = false; 
     for (Thread t : threads) { 
      try { 
       t.join(); 
      } catch (InterruptedException e) { /* NOP */ } 
     } 
    } 

    // ... 

} 
+0

나는이 일을 시도했지만 여전히 스레드는 내가 그것을 따라서 큐에서 호출 복용에 대한 조건을 기다려 스레드가 becuause 이유는 beileve – krs8888

+0

을 실행하는 것 같다 종료되지 않습니다. 내가 틀렸다면 나를 바로 잡습니다. – krs8888

+0

예, 대기열을 폴링하고 싶지는 않지만 작동합니다. 그러나 나는 셧다운 방법에서 독약 사용법을 사용했다. 내가 한 일은 종료 메서드에서 대기열에 포이즌 개체가 추가 된 것입니다. 대기열에서 가져 와서 독이 있는지 확인합니다. 그렇다면 루프 밖으로 빠져 나옵니다 – krs8888

관련 문제