2014-08-29 23 views
5

içinde ben bu çok ilginç davranış rastladı Java Multithreading kavramını öğreniyordu. Bir iş parçacığı oluşturmanın çeşitli yollarını deniyordum. Şu anda sorulan soru şu: Thread'u genişletirken, Runnable arayüzünü uygulamıyoruz. Yan not İlginç Konu davranış Java

, bunu Runnable arabirimini uygulamak yerine Thread sınıfını genişletmek için mükemmel OO mantıklı olduğunun farkındayım, ama bu soruya amaçları olsun diye, Thread sınıf genişletilmiş diyelim.

Let my genişletilmiş Thread sınıfının benim örneği olması t ve kod bloğu benim Thread sınıfının benim run() yöntemi içinde yazılır arka planda gerçekleştirilmek zorundadır.

t.start() ile arka planda mükemmel bir şekilde çalıştı, ancak biraz merak ettim ve t.run() yöntemini çağırdı. Ana iş parçasında yürütülen kod parçası!

t.start()t.run() değil o ne yapar?

+4

Ben burada cevap bulabilirsiniz inanmak: //stackoverflow.com/questions/8579657/java-whats-the-difference-between-thread-start-and-runnable-run http://stackoverflow.com/questions/15841301/difference-between-running-and -sürümleme-a-iş parçacığı –

+0

http: // stackoverflow.com/a/13134221/3436942, size yeterince kolay dilde farkı söyler. Oldukça fazla ** t.start(); ** ** t.run(); ** iken sadece yeni bir iş parçacığı yaratıyor/yapıyor – jbutler483

cevap

8

sınıf yaptığı iştir bu. T.start() aslında yeni bir iş parçacığı başlatır ve sonra bu iş parçacığındaki run() işlevini çağırır. Doğrudan run() işlevini çağırırsanız, geçerli iş parçacığınızda çalıştırırsınız.

public class Test implements Runnable() { 
    public void run() { System.out.println("test"); } 
} 

... 

public static void main(String...args) { 
    // this runs in the current thread 
    new Test().run(); 
    // this also runs in the current thread and is functionally the same as the above 
    new Thread(new Test()).run(); 
    // this starts a new thread, then calls run() on your Test instance in that new thread 
    new Thread(new Test()).start(); 
} 

Bu, amaçlanan davranıştır.

+0

Wow, müthiş bir açıklama! Cevabınız için teşekkür ederim. :) – avismara

1

t.start() basitçe, dediğini yapar: kodun run() 'ın kısmını yürüten yeni bir iş parçacığı başlatır. t.run(), geçerli iş parçacığından (sizin durumunuzda, ana iş parçacığından) bir nesnenin işlev çağrısıdır.

Sadece şunu unutmayın: bir iş parçacığının start() numaralı işlevi çağrıldığında, yeni bir iş parçacığı başlatılır, aksi halde, işlevlerinin çağrılması (start() dışında), başka bir nesnede düz bir işlevi çağırmakla aynı şeydir.

+0

Cevabınız için teşekkür ederiz. :) – avismara

0

t.start() aslında yeni bir iş parçacığı içinde run() yöntemi uygulamak için bir yerli çağrı yapar. t.run() sadece geçerli iş parçacığında run() yürütür. o Konu sınıf Aslında

uzatmak için daha Runnable arabirimini uygulamak için mükemmel OO mantıklı Şimdi

, Yan not

, farkındayım, bu mükemmel OO mantıklı Her iki yaklaşımı takip etmek (Runnable'ı uygulamak veya Thread'i genişletmek). OO anlamında bir kişi kötü değil. (. Gerçekte OO tasarım kırmak kudreti): http size uygulayarak almak avantaj Runnable size sınıf başka sınıfını genişletmek yapabilirsiniz

+0

s/Ana iplik/akım ipliği /, AFAIK. – DarkDust

+0

Mevcut içeriğe göre konuşuyordum. Eğer bir 'Thread''e özellikler ve işlevler eklemeyi planlıyorsanız, 'Thread' sınıfını genişletmek mantıklıdır. Yeni bir iş parçacığı oluşturmak istiyorsanız, 'Runnable' sınıfını uygulayın. :) – avismara

+0

@DarkDust - Seni alamıyorum. – TheLostMind