2012-05-31 27 views
8

Yaptığım bir oyun için iş parçacığı ile çalışıyorum. Konuya yeni çok oldum, bu yüzden doğru bir şekilde anlayamıyorum. Benim sorum, currentThread() yönteminin java API'sinin Thread sınıfında nasıl çalıştığıdır. API, "Şu anda çalıştırılan iş parçacığı nesnesine bir başvuru döndürür" der, ancak birden çok iş parçacığının aynı anda çalıştırıldığını anladığım kadarıyla. Sadece bir iş parçacığı döndürmek nasıl mümkün olabilir?Mevcut Konu Yöntem java

+0

İş parçacığı hakkında bazı eğitici bilgileri okumanız gerekir. – Sajmon

+2

Bence getSelfThread() ya da bunun gibi bir şey belirtmiş olmalılar, çünkü birden çok ccus ile birden fazla iş parçacığı çalıştırabilirsiniz. – goat

cevap

6

currentThread numaralı çağıran kodlar, hepsinden değil, iş parçacıklarından birinde yürütülür, böylece bu iş parçacığı özellikle elde edilebilir.

+0

Teşekkürler, bunu daha net hale getirir. – user1427380

4

Kodunuzdaki bir komut yürütüldüğünde, belirli bir iş parçacığı içinde yürütülür. Bu, bu yöntem tarafından döndürülen iş parçacığıdır.

Açıkçası, belirli bir yöntem birden çok iş parçacığı tarafından yürütülürse, her yürütme, Thread.currentThread() için farklı bir değer döndürebilir.

Bu kısa örnekte neler olup bittiğine dair daha iyi bir fikir edinmek ve özellikle 2 parçacığın paralel olarak yürütüldüğü gerçeğini deneyebilirsiniz. Birkaç döngü aday olacak t1 sonra t2 vb t1 geri aynısını yapmaya ve edecektir görmelisiniz (makinenizde bağlı yüksek bir sayıya 5 ila döngü sayısını artırmanız gerekebilir):

public class TestThread { 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       for (int i = 0; i < 5; i++) { 
        System.out.println(Thread.currentThread()); 
       } 
      } 
     }; 

     Thread t1 = new Thread(r, "t1"); 
     Thread t2 = new Thread(r, "t2"); 
     t1.start(); 
     t2.start(); 
    } 
} 
+1

Geçerli parçayı neden bir döngüde yazdırmanız gerekiyor? Bir kez yeterli olmalı, ben düşünürdüm. – Jeffrey

+0

İlk 2 cümlenizi seviyorum ... ama yazının geri kalanı, özellikle de kod, yanıltıcı olmak için yeterince belirsiz görünüyor. – goat

+0

@Jeffrey, bir ipliğin iki kez döngüyü çalıştırabileceği, diğerinin de aktif hale geldiği bazı serpiştirmeleri göstermekti. – assylias

0

"Şu anda çalıştırılan iş parçacığı", sistem zamanlayıcısının kodunu yürütmek için bu iş parçacığına biraz zaman verdiği anlamına gelir.

-1

Birden çok iş parçacığı aynı anda çalışmıyor ve birden çok iş parçacığı arasında iş parçacığı arasında geçiş var. İşlemci, bir seferde bir görevi yürütebilmek için, bir seferde bir iş parçacığı gerçekleştirilebilir. Bu yüzden şu anda çalışan iş parçacığının referansını alırız.

+0

Çok çekirdekli makineler, tek seferde birden çok iş parçacığı çalıştırıyor. Tek çekirdekli bir makinede çalışan çok parçalı bir programım var (son derece etkileşimli iş parçacıkları ile), daha sonra 4 çekirdekli bir makineye taşıdım. Bu gerçek bir eğitimdi. – RalphChapin

+0

"Birden çok konu _neccessarily_ aynı anda çalışmıyor ..." – jdv

4

Bir parça kağıda yazdırılmış talimatlar listesi olduğunu varsayalım. Bir kişi talimatları okur ve gerçekleştirir. Talimatlar bir programdır. Kişi bir ipliktir. Kağıdın çok sayıda kopyasını alabilir ve birçok kişiye verebilirsin. Talimatlar şöyle bir şey söylerse, "tokatlamak kendinizi", kendiniz o kâğıttan bu komutu okuyan kişiyi ifade eder. Benzer şekilde, Thread.currentThread(), bu aramayı currentThread() olarak yürüten iş parçacığına başvurur.

0

Tek bir iş parçacıklı uygulama yazarken, programınızda her biri bir önceki işlem bittikten sonra yürütülen bir dizi komut gibi bir neden olabilir (bu yaklaşık bir yaklaşımdır, ancak kavramsal olarak karşılaştırıcı ve işlemci bunu simüle etmeye çalışır ve şöyle çalışır: bu gerçekten olsaydı ne oldu.

Birden çok iş parçacığı kullandığınızda, her bir iş parçacığının kendi bir dizi yönergesi vardır. Oluşturulduğunda yeni bir iş parçacığı bir giriş noktası (bir yöntem) geçirilir ve onlardan yürütmeye devam eder. Her bir iş parçacığı, çalıştırılmaları sırasında diğer iş parçacığından bağımsızdır (diğerlerinden sonra bir komut yürütürler), ancak bellek paylaşıyorlar ve böylece bir iş parçacığındaki yan etki bir diğerini etkileyebilir. Bazı kod yürütülecek için

Yani, bir iş parçacığı (uygulamanız başlangıç, o Main yöntemin onun yürütme başlattığınızda işletim sistemi tarafından yaratılan bir tane) bağlamında yapılmalıdır. currentThread işlevi çağrıldığında, bu bağlamlardan biridir.

Bir iş parçacığı oluştururken java çalışma zamanı, iş parçacığı içeriğinde bu Thread nesnesine bir başvuru kaydeder ve currentThread yalnızca oraya bakar ve geçerli iş parçacığı döndürür.

0

Belirli bir zaman noktasında, yalnızca bir iş parçacığı yürütülür (canlı), bu nedenle Thread.currentThread(), o anda çalışan Thread'in ayrıntılarını döndürür. ör., Thread_name, priority, method_name.

İlgili konular