2015-05-31 28 views
5

Sadece iplik hakkında teoriyi öğreniyorum. Ve iş parçacığı ve runnable var.Neden Thread yerine Runnable kullanmalıyım?

class A extends Thread{ 
    public void run(){ 
      while(true) { 
       System.out.println("Hi"); 
      }   
     } 
    } 

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

Konu zengin API ile iyi halde neden yerine Konu Runnable kullanırdınız?

Teşekkürler.

cevap

12

1. Java size şansını kaybetti ve java başka sınıfı genişletir (miras) olamaz Thread sınıf genişletilmiş bir kez böylece yalnızca tek bir Java sınıfı uzatmak anlamına gelir çoklu kalıtım, desteklemez.

2. OOP'ta bir sınıfın genişletilmesi genellikle yeni işlevler eklemek, davranışları değiştirmek veya geliştirmek anlamına gelir. Thread'da herhangi bir değişiklik yapmıyorsanız, bunun yerine Runnable arabirimini kullanın.

3. Uygulamanız Runnable sınıfınızı daha esnek hale getirir (birden fazla arabirim uygulayabilirsiniz).

+0

Hangi durumda Runnable'ı uygulamak ve aynı zamanda başka bir şey uzatmak istersiniz? (ve iş parçacığı, iş parçacığı kendisini genişletemedi) – immibis

+0

Cevabınız için teşekkür ederiz. Sadece sınıfta JFrame niteliklerine ihtiyacımız olduğunu düşünelim, o zaman bunu elde etmek için JFrame'i genişletmeliyiz. Aynı sınıfta iş parçacığı (eşzamanlı olarak işlem) niteliklerine sahip olmamız gerekirse, Runnable'ı uygulamak zorundayız. Çünkü biz Thread'den uzayabiliyoruz (Biz zaten bir sınıfı miras aldık). Umarım anlarsın. @immibis :) – dnuka

+0

@DhanukaLakshan Çoğu kişi sizi Konu uzamamalıdır aynı nedenlerden dolayı JFrame uzanan değil öneriyoruz. Yani bunların iyi nedenler olup olmadığına karar verebilirsiniz :) – immibis

4

Büyük avantajlardan biri: Yeni bir iş parçacığında Runnable çalıştırmanız gerekmez.

Bir gün, yerine yeni bir iş parçacığı üzerinde çalışan, sen (mevcut iş parçacığı üzerinde) doğrudan çalıştırmak gerektiğini karar verebilir ya da bir iş parçacığı havuzu - ve sonra threadPool.submit(runnable) veya runnable.run() için new Thread(runnable).start() değiştirebilir - ve değişiklik sadece bir yeri etkiler.

Ayrıca, bir Runnable etrafta asılı kalırsanız, kaynakları boşa harcamaz - iş parçacığı sınırı (eğer varsa) için sayılmaz ve yığın için yer ayırmaz. Eğer teker teker yapılacaklar bir kuyruk olmasını istedik Say - Emin, bir Queue<Thread> olabilir ve önceki bir bittiğinde sonra her iplik başlamak, ama sonra olmayan çalışan iş parçacığı ile çok fazla bellek harcıyorsun. Bir Runnable s kuyruğu kullandıysanız, aslında çalıştıklarında çok fazla bellek kullanmazsınız.

+0

(ELI5 versiyonu:. Bir Konu "işçi" dir, bir Runnable "Bazı iş" olduğunu Tabii, tek bir şey her ne işçilerin bir grup var, ama bu verimsiz, değil mi?) – immibis

İlgili konular