2010-07-16 7 views
23

Ben ThreadGroup yerine executors kullanarak mevcut uygulamanın farkındayım: Ancak ... Neden ThreadGroup eleştiriliyor?

  • genellikle tercih yolu vb iplikler, gelen durumları yakalamak Konular
  • başa ne ThreadGroup'un içsel kusurları (bu sınıf için belirsiz bir eleştiri duydum) gibi mi?

    Cevabınız için teşekkürler.

    PS. this bu soruya cevap vermiyor gibi görünüyor.

+6

Argh, insanlar "ThreadGroup'u kullanma" deyince nefret ediyorum. "Konuları kullanmayın" demek gibi. Bir iş parçacığı bir ThreadGroup var, bu etrafında bir şey yok, bu yüzden iş parçacığı olmayan bir programa sahip olmak istemiyorsanız, ** ThreadGroups ** kullanıyorsunuz. * Ne zaman, nasıl ve neden * kullanılmaması gerektiğini sormak için bir soruya ihtiyacımız var. Mark Peters'ın belirttiği nedenlerden dolayı –

+0

+1 ve bu sorunun iyi bir araç olduğu için. –

+0

bu topluluk Wiki neden? –

cevap

30

Bu Effective Java 2nd Ed. açıklanmıştır, Madde 73.

Konu grupları başlangıçta güvenlik amaçlı uygulamaları izole etmek için bir mekanizma olarak öngörülen edildi. Bu sözünü hiçbir zaman yerine getirmediler ve güvenlik öncelikleri, Java güvenlik modelindeki [Gong03] standart çalışmalarda bile belirtilmemiş olsalar bile olmadıkları ölçüde azaldı.

[...] ironik bir cilvesi olarak, ThreadGroup API iplik güvenlik açısından zayıftır. Bir iş parçacığı grubundaki etkin iş parçacıklarının bir listesini almak için, yöntemini tüm etkin iş parçacıklarını tutmaya yetecek kadar büyük bir parametre olarak alan yöntemini çağırmalısınız. activeCount yöntemi, bir iş parçacığı grubunda etkin iş parçacıklarının sayısını döndürür, ancak bir dizi ayrıldıktan ve enumerate yöntemine iletildikten sonra bu sayının hala doğru olacağını garanti etmez. iş parçacığı sayısı artmışsa ve dizi çok küçükse,yöntem , dizide yer olmayan tüm konuları sessizce yok sayar.

Bir iş parçacığı grubunun alt gruplarını listeleyen API benzer şekilde kusurludur. bu sorunlar yeni yöntemlerin eklenmesiyle düzeltilebilirken, gerçek gereksinimi olmadığından, iş parçacığı geçersizdir. ThreadGroup.uncaughtException yöntem bir iplik yakalanmamış özel durum zaman kontrol altına almak için tek yol olduğu: 1.5 serbest bırakmak için

önce, sadece ThreadGroup API kullanılabilir işlevselliği bir küçük parçası oldu. Bu işlev, örneğin yığın izlerini bir uygulama için özel günlüğüne yönlendirmek için kullanışlıdır. Ancak, 1.5 sürümünden itibaren, numaralı numaralı 'un setUncaughtExceptionHandler yöntemiyle kullanılabilir.

Özetlemek gerekirse, iş parçacığı grupları yararlı işlevler açısından çok fazla bilgi sağlamazlar, ve sağladıkları işlevselliklerin çoğu kusurludur. Konu grupları en iyi başarısız bir deneme olarak görülüyor ve sadece varlıklarını görmezden gelmelisiniz. Mantıksal iş parçacıkları gruplarıyla ilgilenen bir sınıf tasarlıyorsanız, , büyük olasılıkla iş parçacığı havuzu yürütücüler kullanmalısınız (Madde 68).

+0

Alıntı için teşekkürler. Bu yüzden, pratiğimizde, ThreadGroup'un hala içerde kaldığı gerçeğinden tamamen emin olmamız gerektiğini doğru şekilde anlıyorum: start() ve init (ThreadGroup g, Runnable target, String name, long stackSize), ikincisi Thread() yapıcı ve her zaman ThreadGroup oluşturur? – Max

+0

CW’yi ve ref. Sonunda kitabı aldım ama henüz bu kadarı yok. 'UncaughtException' işlevi aslında merak ettiğim son şeydi. –

+0

@Max Genel amaçlı kütüphane kodu, hala hangi ThreadGroup'un oluşturduğunun farkında olmalıdır. Bu yüzden, bazı amaçlar için hala bununla uğraşmak zorundasınız. –