Tavsiye, 2024

Editörün Seçimi

Java'da Thread Sınıfı ile Çalıştırılabilir Arayüz arasındaki fark

Bir iplik iki şekilde tanımlanabilir. İlk olarak, zaten bir Runnable arabirimi uygulamış olan bir Thread sınıfını genişleterek . İkincisi, doğrudan çalıştırılabilir bir arabirim uygulayarak . Thread sınıfını genişleterek bir thread tanımladığınızda, Thread sınıfındaki run () metodunu geçersiz kılmanız gerekir. Bir Çalıştırılabilir arayüz uygulayan bir iş parçacığı tanımladığınızda, Çalıştırılabilir arabirimin tek çalıştırma () yöntemini uygulamanız gerekir. Thread ve Runnable arasındaki temel fark, Thread sınıfını genişleterek tanımlanan her threadın benzersiz bir nesne yaratması ve bu nesne ile ilişkilendirilmesidir. Öte yandan, Runnable arabirimi uygulanarak tanımlanan her iş parçacığı aynı nesneyi paylaşır.

Aşağıda gösterilen karşılaştırma çizelgesi yardımıyla Thread ile Runnable arasındaki diğer bazı farklılıkları da gözlemleyelim:

Karşılaştırma Tablosu

Karşılaştırma için temeliplikRunnable
TemelHer iş parçacığı benzersiz bir nesne oluşturur ve onunla ilişkilendirilir.Birden çok iş parçacığı aynı nesneleri paylaşır.
BellekHer iş parçacığı benzersiz bir nesne oluştururken, daha fazla bellek gerekir.Birden fazla iş parçacığı aynı nesneyi paylaştığı için daha az bellek kullanılır.
uzatmaJava'da çoklu mirasa izin verilmez, dolayısıyla bir sınıf Thread sınıfını genişlettikten sonra, başka bir sınıfı genişletemez.Runnable arabirimini uygulayan bir iş parçacığı tanımlanırsa, bir sınıfı genişletme şansı vardır.
kullanımBir kullanıcı, thread sınıfını sadece Thread sınıfındaki diğer yöntemleri geçersiz kılmak istiyorsa genişletmelidir.Yalnızca run yöntemini uzmanlaştırmak istiyorsanız, Runnable'ı uygulamak daha iyi bir seçenektir.
bağlantıİş parçacığı sınıfının genişletilmesi, sınıf iş parçacığı sınıfının kodunu ve aynı zamanda iş parçacığına atanan işi içerdiğinden sıkı bağlantı sağlarRunnable arayüzünün uygulanması, Thread kodu, Threads işinden ayrı olduğu için gevşek birleşme sağlar.

İplik Sınıfının Tanımı

Thread, java.lang paketindeki bir sınıftır. Thread sınıfı bir Object sınıfını genişletir ve Runnable arayüzlerini uygular. Thread sınıfı, iş parçacığı üzerinde oluşturmak ve çalıştırmak için yapıcılara ve yöntemlere sahiptir. Birden fazla iş parçacığı oluşturduğumuzda, her iş parçacığı benzersiz bir nesne oluşturur ve bu nesneyle ilişkilendirilir. Thread sınıfını genişleten bir thread oluşturursanız, java çoklu kalıtımın desteklememesi nedeniyle başka bir sınıfı da genişletemezsiniz. Bu nedenle, Thread sınıfını yalnızca bazı Thread sınıfı yöntemlerini geçersiz kılmak istediğinizde genişletmeyi seçmelisiniz. Bir Thread sınıfını genişleten bir thread yaratmanın bir örneğini görelim.

 / * Bir iş parçacığı tanımlamak * / Class Mythread, iş parçacığının {/ * işini uzatıyor * / public void run () {((int i = 0; i <10; i ++) {System.Out.Println ("Child Thread") ); }} Sınıf mainThread {/ * ana iş parçacığının işi * / public static void main (String args []) {Mythread mt = new Mythread (); / * ana iş parçacığı alt iş parçacığını oluşturdu * / mt.start (); (int i = 0; i <10; i ++) {System.Out.Print ("Main Thread"); }}} / * Çıktı * / Ana Konu Ana Konu Ana Konu Ana Konu Çocuk Konu Alt Konu Çocuk Konu Alt Konu Çocuk Konu Alt Konu Ana Konu Alt Konu Ana Konu Ana Konu Alt Konu Çocuk Konu Alt Konu 

Yukarıdaki kodda, Thread sınıfını genişleten ve Thread sınıfının bir çalışma yöntemini geçersiz kılan bir Mythread sınıfı oluşturdum. Ana yöntemi içeren sınıfta, Mythread sınıfından bir iplik nesnesi (mt) oluşturdum ve thread nesnesini kullanarak start () yöntemini çağırdım. Start yöntemi ipliğin yürütülmesini başlatır ve aynı zamanda JVM ipliğin run metodunu çağırır. Şimdi programda bir ana konu ve ana konu tarafından oluşturulan ikinci alt konu olmak üzere iki konu var. Her iki dişlinin yürütülmesi eşzamanlı olarak gerçekleşir, ancak kesin çıktı önlenemez.

Çalıştırılabilir Arabirimin Tanımı

Runnable, java.lang paketindeki bir arayüzdür. Runnable arayüzünü uygulayarak bir iplik tanımlayabiliriz. Runnable arabiriminin, Runnable arabirimini uygulayan sınıfın uyguladığı tek bir yöntem run () vardır. Bir Çalıştırılabilir arabirim uygulayan iş parçacığı tanımlamayı seçtiğinizde, diğer sınıfları genişletme seçeneğiniz de vardır. Runnable arabirimini uygulayarak birden çok iş parçacığı oluşturduğunuzda, her iş parçacığı aynı çalıştırılabilir örneği paylaşır. Runnable arabirimini kullanarak bir iş parçacığının nasıl tanımlanacağını öğrenelim.

 / * Bir iş parçacığı tanımlamak * / Class Runnablethread, * / public void run () {için (<i; 0; i <10; i ++) iş parçasının Runnable {/ * işini uygular {System.Out.Println ("Child Thread") ); }} Sınıf mainThread {/ * ana iş parçacığının işi * / public static void main (String args []) {Mythread rt = new Mythread (); / * ana iş parçacığı çalıştırılabilir nesneyi oluşturdu * / Thread t = new Thread (rt); / * ana iş parçacığı alt iş parçacığı oluşturur ve çalıştırılabilir nesneyi geçti * / t.start (); (int i = 0; i <10; i ++) {System.Out.Print ("Main Thread"); }}} / * Çıktı * / Ana Konu Ana Konu Ana Konu Ana Konu Çocuk Konu Alt Konu Çocuk Konu Alt Konu Çocuk Konu Alt Konu Ana Konu Alt Konu Ana Konu Ana Konu Alt Konu Çocuk Konu Alt Konu 

Yukarıdaki kodda, Runnable arabirimini uygulayan ve Runnable arabiriminin run () yöntemini uygulayarak iş parçacığının işini tanımlayan bir Runnablethread sınıfı oluşturdum. Sonra ana yöntemi içeren bir sınıf mainthread oluşturdum. Ana yöntemin içinde, Runnablethread sınıfının çalıştırılabilir bir nesnesini ilan ettim ve bu nesneyi bir iş parçacığı bildirirken Thread'nın yapıcısına ilettim. Bu şekilde, thread nesnesini (t) bir çalıştırılabilir nesne (rt) ile bağladım. Daha sonra thread nesnesini, Runnablethread sınıfının run yöntemini çağıran thread dizisinin start yöntemini çağırır. Runnable nesnesini Thread nesnesine bağlamazsam, thread başlaması yöntemi, Thread sınıfının çalışma yöntemini çağırırdı. Şimdi, yine kodda iki iş parçacığı var, ana iş parçacığı ve ana iş parçacığı, her ikisi de aynı anda yürütülebilen alt iş parçacığı oluşturuyor, ancak kesin çıktı asla önlenemez.

Java'da Thread ile Runnable Arasındaki Temel Farklılıklar

  1. Thread sınıfını genişleterek oluşturulan her thread, bunun için benzersiz bir nesne yaratır ve bu nesne ile ilişkilendirilir. Öte yandan, bir Runnable arabirimi uygulanarak oluşturulan her iş parçacığı aynı çalıştırılabilir örneği paylaşır.
  2. Thread sınıfı genişletilerek yaratıldığında her bir konu benzersiz bir nesne ile ilişkilendirildiğinden, daha fazla bellek gerekir. Öte yandan, Runnable arabirimi uygulanarak oluşturulan her iş parçacığı aynı nesne alanını paylaşır, bu nedenle daha az bellek gerektirir.
  3. Thread sınıfını daha sonra genişletirseniz, Java'nın çoklu kalıtıma izin vermediğinden başka bir sınıfı miras alabilirsiniz, ancak Runnable'ı uygulamak hala bir sınıfın diğer herhangi bir sınıfı miras alma şansını sağlar.
  4. Bir Thread sınıfını sadece, Thread sınıfının diğer bazı metotlarını geçersiz kılmak veya uzmanlaştırmak zorunda kalırsa genişletmelidir. Yalnızca çalıştırma yöntemini özelleştirmek istiyorsanız, Çalıştırılabilir bir arabirim uygulamanız gerekir.
  5. Thread sınıfının genişletilmesi, Thread kodunun sıkı bir şekilde bağlanmasını sağlar ve Thread sınıfı ile aynı iş parçacığının işi bulunur. Öte yandan, Runnable Runnable arayüzü, Thread kodu, thread'a atanan işten ayrı olduğu için kodda gevşek bağlantı sağlar.

Sonuç:

Thread sınıfını genişletmek yerine bir Çalıştırılabilir arayüz oluşturmak tercih edilir. Runnable uygulamak, iş parçacığı işine atanan sınıftan farklı olduğundan, kodunuzu gevşek bir şekilde birleştirir. Daha az bellek gerektirir ve aynı zamanda bir sınıfın diğer herhangi bir sınıfı miras almasına izin verir.

Top