2010-02-25 11 views
15

ScheduledThreadPoolExecutor10 Yeni bir görev varsa, son iş parçacığını da sonlandırmak için durur ve yeni görevler varsa (ve iş parçacığı bir süre canlı tutar). Ama yapacak daha fazla iş olmadığında, tekrar tüm konuları atmalıdır.ScheduledThreadPoolExecutor ve corePoolSize 0?

Neredeyse new ScheduledThreadPoolExecutor(0) olarak oluşturdum, ancak sonuç olarak, hiçbir iş parçacığı oluşturulmamış veya herhangi bir zamanlanmış görev yürütülmemiş. Ben ScheduledThreadpoolExecutor etrafında kendi sarıcı yazmadan benim hedefe ulaşabilirsiniz eğer

herkes bana söyleyebilir misiniz?

Şimdiden teşekkürler!

+1

Sadece "ExecutorService" yerine "ScheduledExecutorService" arabirimini uygulamak istediğiniz dışında, Executors.newCachedThreadPool() 'dan bir" ExecutorService "gibi iş parçacıklarını oluşturan ve aşağıdakine düşüren bir şey istediğiniz gibi olur arayüz. Bu doğru bir özet mi? –

+0

Aslında, evet, bu oldukça doğru bir özet. –

cevap

14
bunu yapabilirsiniz Aslında

fakat onun olmayan bariz:

  • Eğer KeepAliveTime set
  • istediğiniz parçacığı maksimum sayıda çekirdek konuları set Yapıcıda yeni ScheduledThreadPoolExecutor
  • oluştur uygulamakla
  • ve son olarak bir izin çekirdek lifler zaman aşımı

    m_Executor = new ScheduledThreadPoolExecutor (16,null); 
    m_Executor.setKeepAliveTime (5, TimeUnit.SECONDS); 
    m_Executor.allowCoreThreadTimeOut (true); 
    

    Bu yalnızca Java 6 Alex V'nin çözüm tamamdır önerebiliriz ThreadPoolExecutor javadocs Okuma olsa

+0

Çok teşekkürler, bu tam olarak ihtiyacım olan şey gibi geliyor. –

7

java.util.concurrent'da sağlanan hiçbir şeyin bunu sizin için yapacağından şüpheleniyorum, çünkü zamanlanmış bir yürütme hizmetine ihtiyacınız varsa, genellikle yinelenen görevleri gerçekleştirmeniz gerekir. Yinelenen bir göreviniz varsa, genellikle iş parçacığınızı tutmak ve bir sonraki yineleme sırasında yeni bir tane oluşturmak yerine, aynı iş parçacığını etrafında tutmak ve bir sonraki işlem tekrarı için kullanmak daha mantıklı . Tabii

, zamanlanmış infaz tekrarlanmayan görevler arasında gecikmeler eklemek için kullanılabilir, ya da kaynaklar o kadar sınırlı, nüks o kadar, tüm konuları yıkmak mantıklı böylece seyrek olduğu bu durumlarda kullanılabilecek yeni çalışma geliyor. Bu yüzden, teklifinizin kesinlikle anlamlı olabileceği durumları görebiliyorum. Bunu uygulamak için, önbelleğe alınmış bir iş parçacığı havuzunu Executors.newCachedThreadPool'dan tek iş parçacıklı zamanlanmış yürütme hizmetiyle (örn. new ScheduledThreadPoolExecutor(1)) birlikte sarmayı denerim. Görevler, planlanan yürütme hizmeti aracılığıyla planlanabilir, ancak zamanlanmış görevler, tek iş parçacıklı programlanmış yürütücünüzü yürütmek yerine, tek iş parçacıklı yürütücünün bunları önbelleğe alınmış iş parçacığı havuzuna teslim etmesini sağlayacak şekilde sarılır. yürütme.

Bu tür bir uzlaşma, kesinlikle yapacak bir iş olmadığında en fazla bir iş parçacığı verir ve çok fazla şey olduğunda, gerektiğinde (sisteminizin sınırları dahilinde) çok fazla iş parçacığı verir. yapılacak iş

+0

Eloksal yanıt için teşekkürler. Aslında, tekrarlanan işlemler için değil, gecikmiş işlemler için ScheduledThreadPool kullanıyorum. Ve eylemlerin çoğu tek seferlik eylemlerdir ve her seferinde bir iş parçacığı oluşturmaktan nefret ediyorum. Ayrıca, bir ScheduledExecutorService'i, bunu yapmanız gereken çeşitli sınıflar arasında açık bir şekilde paylaşmaktan nefret ediyorum. –

8

ile çalışır. Ancak, bunu yapmak gereksiz yere gereksiz yere iplik üretme ve yok etme ile sonuçlanacaktır. ScheduledThreadPool, değişken sayıda iş parçacığıyla çalışmak üzere tasarlanmamıştır. Kaynağa baktıktan sonra, hemen her görev yaptığınızda yeni bir iş parçacığı oluşturmaya başlayacağınızdan eminim. SADECE gecikmiş görevler gönderiyor olsanız bile Joe'nun çözümü işe yarayacaktır.

PS.Mevcut uygulamanızda kaynak israf etmediğinizden emin olmak için iplerinizi izlerim.

5

Bu sorun, ScheduledThreadPoolExecutor (Bug ID 7091003) alanında bilinen bir hatadır ve Java 7u4'te düzeltilmiştir. looking at the patch olmasına rağmen, düzeltme "corePoolSize 0 olsa bile en az bir iş parçacığı başlatılır."