2011-08-12 21 views
5

AWT EDT'ye iş birimlerini göndermek için invokeLater()'un sadeliğini beğendim. (Örneğin SwingWorker gibi) bir arka plan iplik iş isteklerini göndermek için benzer bir mekanizmaya sahip güzel olurdu ama anladığım kadarıyla, bu invokeLater() bağlıdır budur & sevk mekanizması, kuyruk olayın herhangi bir tür yok. Java'da "olay odaklı" bir arka plan iş parçacığı nasıl oluşturabilirim?

Bunun yerine, benim arka plan diğer ipler mesajları göndermek için bir engelleme kuyruğu, iplik vererek sona erdi ettik ve iplik esasen bir mesaj gelene kadar bloke bir alma döngü çalışır.

aslında, tek bir arka plan iş parçacığı EDT benzeri davranışları uygulamak (veya ki?) Nasıl tam olarak olabilir, o. Öte yandan, oradaki iniş çıkışlı bir iş parçacığının basitliğini, gökyüzündeki bazı görünmeyen Olay Sevk Kuyruğu'ndan gönderildiklerinde "iş damlacıkları" işledikçe seviyorum. Java böyle bir "olay odaklı çalışan iş parçacığı" oluşturmanın bir yolunu sunuyor mu? Ya da, sonuçta bunu yapmak için doğru yolu gösteren bir mesaj mıdır? Ve ilişkili bir damarda, invokeLater() mesaj gönderme tekniğinin dezavantajları var mı?

cevap

1

Daha spesifik olarak, executor.execute(runnableTask); gibi bir isteği işleyebilen bir iş parçacığı havuzu olan java.util.concurrent, daha spesifik olarak Executor 'den bir göz atmalısınız. Tüm isteği işlemek için tek bir iş parçacığı istiyorsanız, iş parçacığınızı tek bir iş parçacığıyla oluşturun: executor = Executors.newSingleThreadExecutor()'. Görev yapıldığı zaman bir değer döndüren ExecutorService vardır.

+0

hakkında bilmek ama "sevk" Ben arıyordum sağlamak görünmüyor. – Chap

+0

Tek bir iş parçacıklı yürütücüde bir runnable göndermek, EDT'de bir runnable göndermek gibidir. Görevler işlem için sıraya alınır ve iş mevcut değilse iş parçacığı beklemede kalır. – toto2

+0

@Chap Diğer cevabın yorumlarında sorununuzun açıklamasını okudum ve tek bir iş parçacığının tam olarak aradığınız şey olduğu anlaşılıyor. – toto2

3

sorunların farklı sınıfını çözmek için sadece farklı bir yaklaşımdır (eğer engelleme kuyruğunda ile istihdam ediyoruz budur) Producer-Consumer Design Patter; EDT, Worker Design Pattern kullanıyor. Her iki tasarım modeline de göz atın ve hangisinin sizin ihtiyaçlarınıza en uygun olduğunu görün.

  • Üretici-Tüketici modeli genellikle, bağımsız görevleri ayrı ayrı yürüten birden fazla iş parçacığına sahip olduğunuzda kullanılır. EDT kullandığı
  • İşçi desen, (bu durumda GUI ipliği) tek iplik halinde birden fazla görevi sonucunu huni için kullanılır. Tabii

, Producer-Tüketici deseni alıp tek bir kuyruk ve birden üreticileri ile tek tüketiciyi varsa İşçi desenine benzer bir davranış elde, ama bu sadece tasarım desenleri esnekliğini vurgular yapabilirsiniz. Öyleyse, bir tasarım modelinin seçilmesi, özel durumunuz için en iyi olanı temel almasıdır - kalıplar arzu ettiğiniz davranışa uyum sağlayacak kadar esnek olduğunda özellikle yanlış bir seçim yoktur. İyi

+0

+1 Zıtlık desenlerini tanımlamak için +1 – Chap

+0

Durumum kesinlikle İşçi düzenini çağırır - Seri olarak işlenecek her göreve, tek bir iş parçacığına ihtiyacım var. Ancak, SwingWorker'a bağlandınız - noktayı kaçırıyor olabilirim, ancak birden çok SwingWorker iş parçacığının eşzamanlı olarak üretilmesi mümkün değil mi? Bu benim için işe yaramazdı. – Chap

+0

A 'SwingWorker', birden çok göreviniz olduğunda GUI'nin donmasını önlemek için çalışan tasarım desenini (wiki sayfasında tasvir edilen) kullanır. GUI güncelleştirmeleri hala GUI iş parçacığından yapılır, çünkü "SwingWorker" işlemi tamamlandığında geri çağırır. Yorumunuza göre, bu sizin için doğru yaklaşım gibi görünmüyor. Ameliyatınız tek bir iş parçacığı üzerinde yapılmasını gerektiriyorsa, tek bir tüketici (iş parçacığı) ve birden fazla üretici ile Üretici-Tüketici modelini kullanın, yalnızca tüketici görevi yürütür. – Kiril

İlgili konular