Soru Tarihi:
Java'da çok iş parçacığı desteği başlangıçtan itibaren uygulanmıştır. İş parçacıkları birden fazla görevi paralel olarak yürütmeyi mümkün kılar, çok çekirdekli işlemcileri etkili bir şekilde kullanır. JVM, işletim sisteminin iş parçacıkları üzerinde bir soyutlama katmanı sağlar.
Problemler:
İş parçacıklarının oluşturulması, yönetilmesi ve sonlandırılması, yaşam döngülerinin, senkronizasyonun ve olası yarış koşullarının iyi anlaşılmasını gerektirir. İş parçacıklarının dikkatsiz kullanımı, deadlock'lara, kaynaklara hatalı erişime ve karmaşık hata günlüklerine yol açabilir.
Çözüm:
Java'da iş parçacıkları, Thread sınıfının genişletilmesi veya Runnable arayüzünün uygulanması yoluyla, ayrıca ExecutorService gibi modern araçlar aracılığıyla oluşturulabilir. İş parçacıklarını düzgün bir şekilde sonlandırmak, yaşam döngülerini yönetmek ve paylaşılan verilere erişimi senkronize etmek önemlidir.
İş parçacığının oluşturulması ve sonlandırılması için örnek:
class MyRunnable implements Runnable { public void run() { System.out.println("İş parçacığı çalışıyor"); } } public class ThreadExample { public static void main(String[] args) { Thread t = new Thread(new MyRunnable()); t.start(); // iş parçacığını başlat try { t.join(); // bitmesini bekle } catch (InterruptedException e) { e.printStackTrace(); } } }
Anahtar özellikler:
start() yöntemi ile başlatılması gerekmektedir, run() ile değil (aksi takdirde gerçek bir paralellik olmayacaktır)join() kullanmak önemlidirIllegalThreadStateException atarBir iş parçacığını sonlandıktan sonra tekrar başlatmak mümkün mü?
Hayır. İş parçacığı sonlandığında "ölü" olarak kabul edilir, tekrar start() çağrısı IllegalThreadStateException ile sonuçlanır.
t.run() ve t.start() çağrısı arasındaki fark nedir?
t.run() yalnızca mevcut iş parçacığında run metodunu çağırır, yeni bir yürütme iş parçacığı oluşturmaz. Sadece t.start() işletim sisteminde ayrı bir iş parçacığı oluşturur.
Eğer iş parçacığı işlenmemiş bir istisna ile sonlanmışsa ne olur?
Eğer işlenmemiş bir istisna atılırsa, iş parçacığı acil olarak sonlanır, yığın izi hata akışına yazdırılır, diğer iş parçacıkları etkilenmez.
start() yerine run() çağrılmasıInterruptedException işlenmemesi)Programcı, iş parçacığını run() metodu ile başlatır, bunun ana ile paralel çalıştığını düşünür, oysa tüm işlemler sıralı olarak gerçekleşir.
Artılar:
Eksiler:
start()'ın doğru kullanımı, istisnaların uygun bir şekilde işlenmesi, iş parçacıklarının sonlanmasını beklemek için join()'ın kullanılması.
Artılar:
Eksiler: