SORU
25 Kasım 2009, ÇARŞAMBA


İmkansız bir boyut sınırı ile önbelleğe alınan bir iş parçacığı havuzu yapmak için?

Yaratabilir bu iş parçacığı sayısı için bir sınır ile önbelleğe alınan bir iş parçacığı havuzu yapmak imkansız gibi görünüyor.

Nasıl statik Varisle burada.newCachedThreadPool standart Java kütüphanesi ile uygulanır:

 public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

Yani, bu şablon önbelleğe boyutlu sabit bir iş parçacığı oluşturmak için kullanarak havuzu:

new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>());

Şimdi bu kullandığınız ve 3 görevleri teslim olursa, her şey iyi olacak. Başka görevlere gönderilmesi reddedildi yürütme istisnalar neden olur.

Bu çalışıyor:

new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>());

Tüm iş parçacığı neden olur sırayla yürütülüyor. I. e., iş parçacığı havuzu asla birden fazla iş parçacığı görevleri ele yapacaktır.

Bu ThreadPoolExecutor yöntemi yürütmek böcek mi? Belki de bu kasıtlı mı? Veya başka bir yolu var mı?

Edit: istediğim bir şey tam olarak önbelleğe alınan iş parçacığı havuzu oluşturur iş parçacığı üzerinde talep ve sonra onları öldürür sonra bazı zaman aşımı) ama bir sınırı iş parçacığı sayısı çok daha kolay oluşturmak ve yetenek devam etmek için sıra ek görevler var bir kere vurdu iplik sınırı. Sjlee cevabına göre bu imkansız. Yürütme() ThreadPoolExecutor yöntemi gerçekten mümkün değildir. SwingWorker, ama yürütme kendi SwingWorker bir şey oldu mu gibi ThreadPoolExecutor alt ve yürütme geçersiz kılmak gerekir() biraz() tam bir eşek.

CEVAP
25 Kasım 2009, ÇARŞAMBA


Bu ThreadPoolExecutor aşağıdaki birkaç temel davranışları ve sorunlarınızı bu davranışları ile açıklanabilir.

Görevleri gönderildiğinde,

  1. Eğer iş parçacığı havuzu çekirdek boyutuna ulaşmış değilse, yeni bir iş parçacığı oluşturur.
  2. Çekirdek boyutu ulaşıldı ve boş iş parçacığı yoktur, kuyrukları görevler.
  3. Eğer çekirdek boyutu ulaşıldı, boş iş parçacığı yok ve sıra tam olur, yeni bir iş parçacığı maksimum boyuta ulaşana kadar) oluşturur.
  4. Eğer max boyutu ulaşıldı, boş iş parçacığı yok ve sıra tam olur, ret politikası devreye giriyor.

İlk örnekte, SynchronousQueue aslında 0 boyutu olduğunu unutmayın. Bu nedenle, max ulaştığınız anda (3), terk (#4) boyutu.

İkinci örnekte, seçim sırası sınırsız boyutu olan bir LinkedBlockingQueue. Bu nedenle, #2 davranış ile takılıyorum.

Davranışları tamamen belirlenir neredeyse gerçekten önbelleğe tipi ya da sabit tip fazla olan tinker olamaz.

Eğer sınırlı ve dinamik bir iş parçacığı havuzu olmasını istiyorsanız, olumlu bir çekirdek boyutu ve en büyük boyutu sonlu bir büyüklük sırası ile birlikte kullanmak gerekir. Örneğin,

new ThreadPoolExecutor(10, // core size
    50, // max size
    10*60, // idle timeout
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<Runnable>(20)); // queue with a size

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • george sarintzotis

    george sarin

    2 Aralık 2007
  • Jonnyriddlin1

    Jonnyriddlin

    4 Ocak 2007
  • SoundHound

    SoundHound

    8 Mart 2006