Java Konuları
Java Konuları
Threads, bir programın aynı anda birden çok şey yaparak daha verimli çalışmasına izin verir.
Konular, ana programı kesintiye uğratmadan arka planda karmaşık görevleri gerçekleştirmek için kullanılabilir.
Konu Oluşturma
Bir iş parçacığı oluşturmanın iki yolu vardır.
Sınıfı genişleterek ve
yöntemini Thread
geçersiz kılarak oluşturulabilir:run()
Sözdizimini Genişlet
public class Main extends Thread { public void run() { System.out.println("This code is running in a thread");
}}
Bir iş parçacığı oluşturmanın başka bir yolu, Runnable
arabirimi uygulamaktır:
Sözdizimini uygula
public class Main implements Runnable {
public void run() {
System.out.println("This code is running in a thread");
}
}
Çalışan Konular
Sınıf, sınıfı genişletiyorsa, Thread
iş parçacığı, sınıfın bir örneği oluşturularak ve start()
yöntemini çağırarak çalıştırılabilir:
Genişlet Örneği
public class Main extends Thread {
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
Sınıf Runnable
arabirimi uygularsa, iş parçacığı, sınıfın bir örneğini bir nesnenin yapıcısına ileterek Thread
ve ardından iş parçacığının
start()
yöntemini çağırarak çalıştırılabilir:
Uygulama Örneği
public class Main implements Runnable {
public static void main(String[] args) {
Main obj = new Main();
Thread thread = new Thread(obj);
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
Konuları "genişletme" ve "uygulama" arasındaki farklar
En büyük fark, bir sınıf Thread sınıfını genişlettiğinde başka bir sınıfı genişletemezsiniz, ancak Runnable arabirimini uygulayarak başka bir sınıftan da genişletmek mümkündür, örneğin: class MyClass extends OtherClass implements Runnable
.
Eşzamanlılık Sorunları
İş parçacıkları programın diğer bölümleriyle aynı anda çalıştığından, kodun hangi sırayla çalışacağını bilmenin bir yolu yoktur. Threadler ve ana program aynı değişkenleri okuyup yazarken, değerler tahmin edilemez. Bundan kaynaklanan sorunlara eşzamanlılık sorunları denir.
Örnek
Değişken tutarının değerinin tahmin edilemez olduğu bir kod örneği:
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); System.out.println(amount); amount++; System.out.println(amount);
}public void run() { amount++;
}}
Eşzamanlılık sorunlarından kaçınmak için, iş parçacıkları arasında mümkün olduğunca az öznitelik paylaşmak en iyisidir. Niteliklerin paylaşılması gerekiyorsa, olası bir çözüm, isAlive()
iş parçacığının değiştirebileceği nitelikleri kullanmadan önce iş parçacığının çalışmayı bitirip bitirmediğini kontrol etmek için iş parçacığı yöntemini kullanmaktır.
Örnek
isAlive()
Eşzamanlılık sorunlarını önlemek için kullanın :
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); // Wait for the thread to finish while(thread.isAlive()) { System.out.println("Waiting...");
}// Update amount and print its value System.out.println("Main: " + amount); amount++; System.out.println("Main: " + amount);
}public void run() { amount++;
}}