2012-10-10 17 views
9

TheadPoolExecutor içinde çok sayıda görev var. Arayüzümde ThreadPoolExecutor içindeki tüm dişleri derhal sonlandırması gereken bir durdurma düğmesi var. Bunu yapmanın bir yolunu arıyorum. (shutDown() veya shutDownNow() olmadan).ThreadPoolExecutor ürünündeki tüm çalışanları sonlandırmaya nasıl zorlanırsınız

Teşekkürler

+0

Neden shtudown() 'veya' shutdownNow() 'kullanmıyorsunuz (veya kullanamıyorsunuz)? Bunu yapmanın yolu. – Gray

+0

İş parçacıklarının sonlandırılmasından önce geçerli görevlerin bitmesini beklemesi gerekir. Yani, hemen dişleri öldürmez. – deadlock

+0

'shutdown()' geçerli görevlerin tamamlanmasını bekler. İşte bu nokta. – Gray

cevap

10

Konuları derhal güvenle öldürebilirsiniz. Görevler yerine kesintileri onurlandırmalı ve kesintiye uğradığında durmalısınız. ThreadPoolExecutor.shutdownNow() kullanırsanız, tüm çalışan görevler kesintiye uğrar.

Tek alternatif, iş parçacığı için ayrı bir süreçte işlemi öldürmek için bir sinyal vermesidir.

6

shutdown() sadece ThreadPoolExecutor yeni sunuldu görevleri reddetme yapacak ve kuyruk (ThreadPool sınırsız bir sıra yürütücü ise) bekleyen görevleri çıkarın. shutdownNow(), tam olarak aynı şeyi yapar ve Thread'un interrupt() yöntemini de arar. Yani, run() yöntemde, düzgün idare olmalıdır:

try { 
    Thread.sleep(1000); 
} catch (InterruptedException ie) { 
    // Handle the exception, and close resources. 
} 
+1

'shutdown()' sırayı boşaltmıyor. – The111

+0

@ The111 sırayı boşaltmak için kullanabilirsiniz purge() – WiredCoder

2

sen sırasında çalışan görevler kurtulmak deneyebilirsin sizin Konuda Callable s yerine Runnable s kullanabilir ve someTask.cancel() diyebilirsen shutdownNow() çağrı.

Bunu denemediğime dikkat edin, bu yüzden istediğiniz gibi çalışacağını garanti edemem ama javadoc açıklamasından yola çıkarak denemeye değer.

2

Eski soru, ancak ThreadExpecent() öğesinde çalışan Thread referansını yakalamak için ThreadPoolExecutor öğesini genişletebilirsiniz. shutdownNow() çağrıldığında, tüm çalışan Konuları durdurabilirsiniz. Görevlerinize güvenmek için güçlü bir şekilde inInterrupted() kullanmanızı öneririm.

Örnek kod ->

public class KillableThreadPoolExecutor extends ThreadPoolExecutor { 

    private final Map<Runnable, Thread> executingThreads; 

    public KillableThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, String threadNamePrefix) { 
     super(corePoolSize, maximumPoolSize, keepAliveTime, unit, new YoungMemorySafeLinkedBlockingQueue<Runnable>(), ThreadFactories.create(threadNamePrefix)); 
     executingThreads = new HashMap<>(maximumPoolSize); 
    } 

    @Override 
    protected synchronized void beforeExecute(Thread t, Runnable r) { 
     super.beforeExecute(t, r); 
     executingThreads.put(r, t); 
    } 

    @Override 
    protected synchronized void afterExecute(Runnable r, Throwable t) { 
     super.afterExecute(r, t); 
     if(executingThreads.containsKey(r)) { 
      executingThreads.remove(r); 
     } 
    } 

    @Override 
    public synchronized List<Runnable> shutdownNow() { 
     List<Runnable> runnables = super.shutdownNow(); 
     for(Thread t : executingThreads.values()) { 
      t.stop(); 
     } 
     return runnables; 
    } 
} 
2

ThreadPoolExecutor bir ExecutorService olduğunu. ExecutorService'daki tüm konuları shutdown() veya shutdownNow() yöntemleriyle durduramazsınız. Herkes için bütün Future.get() aracılığıyla

  1. invokeAll()
  2. CountDownLatch
  3. yineleme: oracle belgeler ile page

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

    Diğer seçenekler alıntılanan gibi düzgün kapanmasına bir dizide shutdown(), awaitTermination() ve shutdownNow() yöntemlerini çağırmak zorunda Aynı amaca ulaşmak için Callable görevleri.