SORU
3 AĞUSTOS 2009, PAZARTESİ


Birden çok iş parçacığı kullanılabilir olduğunda birden fazla İŞLEMCİ kullanmaya zorlama

Ne gereği CPU çok fazla kullanan bir Java programı yazıyorum. Ancak, birçok paralel olarak çalışabilir ve programım çok parçacıklı yaptım. Çalıştırdığınızda, sadece görünmek için kullandıkları bir CPU kadar ihtiyacı daha sonra kullandığı başka bir CPU - yapabileceğim herhangi bir şey var Java zorlamak farklı bir iş parçacığı çalıştırmak için farklı çekirdek/İşlemci?

CEVAP
3 AĞUSTOS 2009, PAZARTESİ


Orada Java çoklu iş parçacığı için iki temel yolu vardır. Bu yöntem ile oluşturduğunuz her mantıksal görev gerektiğinde yeni bir çekirdek üzerinde çalışır ve kullanılabilir.

Bir yöntem:bir Çalıştırılabilir veya İplik nesne yapıcı bir Çalıştırılabilir sürebilir) tanımlamak ve konu ile koşmaya başlayın.start yöntemi. OS -- daha az yüklü genellikle verir ne olursa olsun çalıştırır.

Öğretici: Defining and Starting Threads

Yöntem iki:nesneleri işleme kodunuzu içeren Çalıştırılabilir eğer değerleri geri dönüşü olmaz eğer mi () veya Çağrılabilir eğer yaparlarsa () arabirimi, uygulama tanımlayın. Java bir ExecutorService görev olarak bu geçiş.açıklama.eşzamanlı paketi. Java.açıklama.eşzamanlı.Varisle sınıf yöntemleri bir sürü ExecutorServices standart, yararlı tür oluşturmak için vardır. Uygulayıcıların eğitimi için Link.

Kişisel deneyimlerinden, Varisle sabit ve önbelleğe alınan iş parçacığı havuzu iş parçacığı sayısı optimize etmek isteyeceksiniz rağmen çok iyi. Çalışma zamanı.() getRuntime.() availableProcessors çalıştırma mevcut çekirdek sayısı için de kullanılabilir. Uygulamanız bittiğinde iş parçacığı havuzu kapatmak gerekir, aksi halde uygulama Havuzu iş parçacığı çalışmaya devam çünkü çıkış olmayacak.

İyi çok çekirdekli performans almak bazen zor ve frikiklerinden: tam

  • Disk G/Ç vadede ÇOK yavaşlar paralel. Yalnızca bir iş parçacığı okuma/yazma anda disk yapmak gerekir.
  • Nesneleri eşitleme çok kanallı operasyonlar için güvenlik sağlar, ama iş yavaşlar.
  • Görevleri de ise önemsiz (küçük bit çalışma yürütmek hızlı) yönetme yükünü onlara ExecutorService bir masraf daha çoklu çekirdek kazanç.
  • Yeni bir iş Parçacığı oluşturma nesneleri yavaş. Bu ExecutorServices mümkünse yeniden kullanılması konuları mevcut çalışacağız.
  • Çılgın şeyler her türlü birden çok iş parçacığı bir şey üzerinde çalışmak olabilir. Sistem basit tutmak ve görevleri mantıksal olarak ayrı olan ve olmayan etkileşim yapmayı deneyin.

Bir diğer sorun: çalışma kontrol etmek zor! İyi bir uygulama ve görevler ve bir kaç çalışma sıraları (bir ExecutorService kullanarak) ile konuları çalıştıktan sonra oluşturur gönderen bir yöneticisi konu var.

Sadece önemli noktaları burada çok iş parçacıklı programlama programlama en zor konulardan birisi de pek çok uzman tarafından kabul edilir dokunmadan ediyorum. Sezgisel olmayan, karmaşık ve soyut genellikle zayıf.

< / ^ hr .

-- ExecutorService kullanarak Örnek bir düzenleme:

public class TaskThreader {
    class DoStuff implements Callable {
       Object in;
       public Object call(){
         in = doStep1(in);
         in = doStep2(in);
         in = doStep3(in); 
         return in;
       }
       public DoStuff(Object input){
          in = input;
       }
    }

    public abstract Object doStep1(Object input);    
    public abstract Object doStep2(Object input);    
    public abstract Object doStep3(Object input);    

    public static void main(String[] args) throws Exception {
        ExecutorService exec = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        ArrayList<Callable> tasks = new ArrayList<Callable>();
        for(Object input : inputs){
           tasks.add(new DoStuff(input));
        }
        List<Future> results = exec.invokeAll(tasks);
        exec.shutdown();
        for(Future f : results) {
           write(f.get());
        }
    }
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • FF Radio

    FF Radio

    16 Mayıs 2008
  • eurotuner

    eurotuner

    6 Mart 2006
  • TomKNJ

    TomKNJ

    26 ŞUBAT 2007