2012-04-10 26 views
10

Her zaman değişken sayıda iş parçacığı oluşturmak zorundayım. Bunu, bir dizi Dizi oluşturarak ve çok sayıda iş parçacığı oluşturarak yapıyorum.Aynı anda iş parçacığı dinamik sayısı oluşturma

Ancak, çok iş parçacığı kavramı gibi davranan bu çok sayıda iş parçacığının nasıl başlatılacağını anlamıyorum. Paralel çalışmasını istiyorum.

Lütfen bu senario'da ne yapılacağını öğrenin.

+0

Yardım ederse cevabımı kabul ettiğinizden emin olun. – Gray

cevap

2

Temel psuedocode:

create x threads, store them in an array or list; 
for each thread in the list/array 
    call start() on the thread object; 
+0

Bunu yaparsam, iş parçacığı paralel olarak çalışmıyor. Ancak, sırayla normal bir işlev çağrısı olarak koşuyorlar – sowmya

+0

@sowmya İpleri okumanız gerektiğini düşünüyorum. Bir dizi iplik üzerinde sıralı başlatma(), sıralı olarak çalıştığı anlamına gelmez, sadece sıralı olarak başlatıldıkları anlamına gelir. –

+0

Ancak, işlevi, onları başlattığım sıraya göre sırayla çalıştırıyorlar. Bilgime göre, en azından çıktı değişmeli. Ancak, bu gerçekleşmiyor. Eğer Yanlışsam beni düzelt. – sowmya

33

Ama çok iş parçacığı konsepti gibi davranıyor parçacığı bu n numarasını nasıl başlayacağınızı anlamıyorum. Paralel koşmasını istiyorum.

Kesinlikle bir döngü kullanarak iş parçacığı bir dizi oluşturabilirsiniz:

Thread[] threads = new Thread[NUM_JOBS_TO_CREATE]; 
for (int i = 0; i < threads.length; i++) { 
    threads[i] = new Thread(new Runnable() { 
     public void run() { 
      // some code to run in parallel 
      // this could also be another class that implements Runnable 
     } 
    }); 
    threads[i].start(); 
} 

Bu konu paralel arka planda çalışmasına neden olacaktır. Devam etmeden önce hepsinin tamamlanmasını beklemek için onlarla daha sonra katılabilirsiniz.

// wait for the threads running in the background to finish 
for (Thread thread : threads) { 
    thread.join(); 
} 

Ama bunun yerine konu bulunmuştur kendini yönetme, ben yerleşik Java Executors kullanarak öneriyoruz. Bunları sizin için yaparlar, yönetmek daha kolaydır. Bu yöntemin yararlarından biri, görevleri görevlerini, bunları çalıştıran iş parçacığı'dan ayırmasıdır. Örneğin, 1000 iş parçasını ve 1000 iş birimini paralel olarak çalıştırmak için 10 iş parçacığı başlatabilirsiniz.

// create a pool of threads, 10 max jobs will execute in parallel 
ExecutorService threadPool = Executors.newFixedThreadPool(10); 
// submit jobs to be executing by the pool 
for (int i = 0; i < NUM_JOBS_TO_CREATE; i++) { 
    threadPool.submit(new Runnable() { 
     public void run() { 
      // some code to run in parallel 
      // this could also be another class that implements Runnable 
     } 
    }); 
} 
// once you've submitted your last job to the service it should be shut down 
threadPool.shutdown(); 
// wait for the threads to finish if necessary 
threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS); 

fazla bilgi için, Java tutorial on the thread executors bkz:

İşte bazı örnek ExecutorService kod.

+0

Eğer 1000 işim varsa 1000 nesne yaratacaktır bu performans sorunuyla sonuçlanırdı –

+0

1000 nesneler oldukça ucuzdur @ManojRamanan. Nesne bant genişliği açısından 1000 dizgi daha pahalıdır. Bir milyon nesne oluşturduysanız, bazı GC sorunlarını fark edebilirsiniz. Bu nedenle, 'Runnable' üreticisinin tüketicilerden daha hızlı olması durumunda sıraya sınırlar koyarız. – Gray

+0

Teşekkürler, @Gray for the information.can, bu uygulamayı şu anda kullandığım bazı daha fazla bilgiyi paylaşıyorum.Nasıl test edersiniz –

2

İplik dizileri oluşturmamaya ve bunları yönetmeye çalışmamaya çalışın - çok geçmeden bir karışıklığa dönüşecektir. Görevleri çalıştırmak için bir iş parçacığı havuzuna ihtiyacınız varsa, üretici-tüketici kuyruğuna ihtiyacınız vardır. Bir tane oluşturun ve onu oluştururken iş parçacığına, (veya onu üye olarak içeren threadpool nesnesi örneği) iletin. Iş parçacığı yuvarlak, görevleri getirme ve bunları yürütme.

Bunu yapmanın kolay yolu, @Gray, (+1) tarafından ayrıntılı olarak açıklandığı gibi bir ExecutorService kullanmaktır.

Tekrar söylemek gerekirse, dizilerdeki, listelerdeki veya vektörlerdeki konuları mikro-yönetmeye çalışmayın, bunları başlatma, 'patron/yönetim' döngüsündeki durumlarını kontrol etme, onları sonlandırma/iptal etme, bunları yok etme vb. Porsche 911 gibi - büyük miktarda para/zaman harcadıktan sonra, işe yaramayacak gibi görünen bir şeyiniz olacak ve aniden kırılacak ve bir ağaca dönüşecek.

Uzun süre engellenen işler için ayrılmış bir iş parçacığı kullanın; bunlar yoğun ve hızlı bir şekilde yapılabilecekler için bir iş parçacığı.Yeni bir iş parçacığı çalıştırmak için bir şey gerekiyor yerde

Java private static final ExecutorService executor = Executors.newCachedThreadPool();

& bir lamda ifade kullanın 8+: Sınıfın üstünde set okuyuculu gereken bir sınıfta

+0

Teşekkürler Martin !!! Çalıştı ... ExecutoeService kavramını takip ettim. – sowmya

0

: bir newCachedThreadPool Java ile

executor.submit(() -> { 
     myOtherClass.myFunction(doSomething); 
}); 

otomatik ina bir süre sonra onları durdurmak & sistemde cpu çekirdek adedine göre evre sayısını yönetecek ctivity (varsayılan olarak 60 saniye).

İlgili konular