SORU
8 AĞUSTOS 2011, PAZARTESİ


Verim ana kullanım alanları nelerdir ve nasıl üye farklılık gösteriyor mu() ve kesme()?

Biraz Java yield() yöntem kullanımı ile ilgili örnek kod özellikle karışık altındayım. Ayrıca bu verim okudum () 'bir iş parçacığı yürütme önlemek için kullanılan'.

Benim sorular şunlardır:

  1. Aşağıdaki kod, aynı çıktısında yield() kullanırken ve kullanırken sonucu olduğuna inanıyorum. Bu doğru mu?

  2. Aslında yield() ana kullanım alanları nelerdir?

  3. Ne yönden yield() join() interrupt() yöntemleri farklıdır?

Kod örneği:

public class MyRunnable implements Runnable {

   public static void main(String[] args) {
      Thread t = new Thread(new MyRunnable());
      t.start();

      for(int i=0; i<5; i  ) {
          System.out.println("Inside main");
      }
   }

   public void run() {
      for(int i=0; i<5; i  ) {
          System.out.println("Inside run");
          Thread.yield();
      }
   }
}

Aynı çıkış yield() kullanmadan ve hem yukarıdaki kodu kullanarak elde edilir:

Inside main
Inside main
Inside main
Inside main
Inside main
Inside run
Inside run
Inside run
Inside run
Inside run

CEVAP
8 AĞUSTOS 2011, PAZARTESİ


Kaynak: http://www.javamex.com/tutorials/threads/yield.shtml

Windows

Noktasal uygulama, İplik yolu.() verim eserler vardır Java 5, Java 6 arasında değişti.

5, İplik Java.() verim Windows API Uyku(0) çağırır. Bu geçerli iş parçacığı, kuantum ve temizlenmesi özel bir etkiye sahiptir öncelik seviyesi için sıranın sonuna koyarak. Diğer kelimeler, aynı önceliği (ve daha fazla bu konuları çalıştırılabilir tüm öncelikli) elde edilen iplik bir sonraki önce çalıştırmak için bir şans elde edeceksiniz CPU süresi verildi. Sonunda yeniden planlanan zaman geri gelecek tam bir kuantum ile, ama "içinde" herhangi biri taşımaz verimli zaman kuantum kalan. Bu davranış, bir az uyuyan iplik nerede sıfır olmayan bir uykudan farklı genellikle 1 kuantum değeri (, 1/3 10 veya 15ms bir kene etkisini kaybeder.

Java 6, Bu davranış değiştirildi. Noktasal VM şimdi uygular İplik.() verim Windows SwitchToThread kullanarak() API çağrısı. Bu ara geçerli iş parçacığının geçerli timeslice, ama onun PES yapar tüm kuantum. Bu başka öncelikleri bağlı olarak anlamına gelir iş parçacığı, iş parçacığı oluşturan bir kesme gerçekleşecek. süre sonra. Daha fazlası için (thread scheduling bkz Bölüm timeslices ile ilgili bilgiler.)

Linux

Linux altında, Noktasal sadece sched_yield aramaları(). Sonuçları bu ara biraz farklı, ve altında daha büyük olasılıkla daha şiddetli Windows:

  • elde bir iş parçacığı başka bir iş parçacığı CPU bir dilim vardı kadar CPU bir dilim alacak
  • (en azından kernel 2.6.8 itibaren), iplik vermiştir aslında örtülü olarak alınacak programcının keşif tarafından dikkate son CPU ayırma—, örtülü olarak, bir iş parçacığı böylece vermiştir gelecekte planlanan zaman daha fazla CPU verilebilir.

(Öncelikler hakkında daha fazla bilgi için thread scheduling bkz Bölüm ve zamanlama algoritmaları.) Verim()?

Hemen hemen hiç diyebilirim. Onun davranışları sağlamlık ve dayanıklılık tanımlı değil ve genellikle bu görevleri gerçekleştirmek için daha iyi yollar vardır verim ile gerçekleştirmek isteyebilir():

  • eğer CPU sadece bir kısmını kullanmaya çalışıyorsanız, bu iş parçacığı CPU nasıl tahmin edilerek daha kontrollü bir şekilde bunu yapabilirsiniz işleme son parça, sonra biraz uyku kullandı telafi süresi: uyku() yöntemi;
  • eğer bir süreç bekliyor ya da tamamlamak için kaynak ya da mevcut, orada bunu yapmak için daha etkili yollar,gebe iseniz katılın kullanma gibi() başka bir iş parçacığı için beklemek, kullanarak bekleme mekanizması bir iş parçacığı, başka bir sinyal müsaade ediniz/ bir görevi tamamlamak, ya da ideal olarak Java 5 birini kullanarak bir Semafor veya engelleme sırası gibi eşzamanlılık oluşturur.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • B3ASTTY™

    B3ASTTY™

    27 Mayıs 2013
  • HDstarcraft

    HDstarcraft

    12 Mayıs 2009
  • Howard Pinsky

    Howard Pinsk

    6 AĞUSTOS 2006