250 likes | 377 Views
Java Threads. Dr.Galip AYDIN. Java Threads ( İş Par ç ac ı klar ı ). Multithreading: Program içerisinde aynı anda birden fazla işin yapılabilmesi. Aynı program içerisinde birçok Thread çalışabilir.
E N D
Java Threads Dr.Galip AYDIN
Java Threads (İş Parçacıkları) • Multithreading:Program içerisinde aynı anda birden fazla işin yapılabilmesi. • Aynı program içerisinde birçok Thread çalışabilir. • Java’da bütün Thread sınıfları java.lang.Thread classkullanılarak oluşturulur ve kontrol edilir. • Bu iş parçacıkları eşzamanlı olarak asenkron veya senkron olarak çalışabilir.
Multithreading vs. Multiprocessing • Bağımsız işlemlerle karşılaştırıldığında iş parçacıkları daha hafiftir • İş parçacıkları aynı adres alanını paylaştıkları için veri ve kodları paylaşabilir. • Context switching (içerik değiştirme) iş parçacıklarında işlemlere göre daha az pahalıdır • İş parçacıkları arası haberleşme işlemler arası haberleşmeye göre daha ucuzdur • İş parçacıkları farklı görevlerin aynı zaman aralığında gerçekleştirilmesine olanak sağlarlar
Java Threads • thread bir nesne değil bir akış kontrolü yöntemidir • Sırayla işletilecek bir dizi komut barındırır • Thread bir nesnedir void start() • Yeni bir Thread oluşturup çalışabilir hale getirir void run() • Yeni Thread hayatına bu metodun içinde başlar
Thread Oluşturulması Object A Object BThread (extends Thread) Thread t = new BThread(); t.start(); doMoreStuff(); BThread() { } void start() { // create thread } void run() { doSomething(); }
Thread Oluşturulması Object A Object BThread (extends Thread) Thread t = new BThread(); t.start(); doMoreStuff(); BThread() { } void start() { // create thread } void run() { doSomething(); }
Thread Oluşturulması Object A Object BThread (extends Thread) Thread t = new BThread(); t.start(); doMoreStuff(); BThread() { } void start() { // create thread } void run() { doSomething(); }
Thread Oluşturulması Object A Object BThread (extends Thread) Thread t = new BThread(); t.start(); doMoreStuff(); BThread() { } void start() { // create thread } void run() { doSomething(); }
Thread Oluşturulması Object A Object BThread (extends Thread) Thread t = new BThread(); t.start(); doMoreStuff(); BThread() { } void start() { // create thread } void run() { doSomething(); }
Thread Oluşturulması Object A Object BThread (extends Thread) Thread t = new BThread(); t.start(); doMoreStuff(); BThread() { } void start() { // create thread } void run() { doSomething(); }
Thread Oluşturulması Object A Object BThread (extends Thread) Thread t = new BThread(); t.start(); doMoreStuff(); BThread() { } void start() { // create thread } void run() { doSomething(); }
Thread Oluşturulması Object A Object BThread (extends Thread) Thread t = new BThread(); t.start(); doMoreStuff(); BThread() { } void start() { // create thread } void run() { doSomething(); }
Thread Oluşturulması Object A Object BThread (extends Thread) Thread t = new BThread(); t.start(); doMoreStuff(); BThread() { } void start() { // create thread } void run() { doSomething(); }
İş parçacıklarının oluşturulması • Java’da bir iş parçacığı oluşturmak için iki yöntem kullanılır: • Runnable interface kullanmak (java.lang.Runnable) • Thread sınıfını extend etmek (java.lang.Thread)
Runnable Interface • Thread nesnesine yardımcı bir nesnedir • Thread nesnesinin run() metodu Runnable nesnesinin run() metodunu çağırır • Thread’in kalıtıma bağlı olmadan, herhangi bir nesnenin içinde çalışmasını sağlar
Runnable Interface The Runnable Interface Signature public interface Runnable { void run(); } • 1. Herhang bir sınıf Runnable Interface’ini thread tarafından çalıştırılacak olan run() metodunu sağlayarak implement eder. • 2. Thread sınıfının bir nesnesi, kurucu metoduna bir Runnable nesnesi geçilerek oluşturulur. Şimdi Thread nesnesinin run() metodunu implement eden bir Runnable nesnesi var. • 3. Önceki adımda oluşturulan Thread nesnesinin start() metodu uyarılır. Bu metod yeni bir thread başlatılır başlatılmaz kontrolü döndürür. • 4. run() metodu biter bitmez thread biter.
Not Runnable • Bir thread "Not Runnable" durumuna aşağıdaki dört durumdan birisi oluşunca girer: • suspend() metodu çağrılınca • sleep() metodu çağrılınca • Thread wait() metodu kullanarak bir şart değişkenini beklemek için kullanıyorsa • I/O için blok olmuşsa.
Thread Lifecycle Active sleep(500) Blocked wake up Born JVM start() suspend() Runnable resume() stop() wait stop() notify Dead block on I/O I/O available
public class RunnableOrnek { public static void main(String[] args) { Thread thread1 = new Thread(new RunnableThread(), "thread1"); Thread thread2 = new Thread(new RunnableThread(), "thread2"); RunnableThread thread3 = new RunnableThread("thread3"); //Start the threads thread1.start(); thread2.start(); try { //delay for one second Thread.currentThread().sleep(1000); } catch (InterruptedException e) { } //Display info about the main thread System.out.println("MAIN " + Thread.currentThread()); } } class RunnableThread implements Runnable { Thread runner; public RunnableThread() { } public RunnableThread(String threadName) { runner = new Thread(this, threadName); System.out.println("RUNNER " + runner.getName()); runner.start(); } public void run() { System.out.println("INFO: " + Thread.currentThread()); } }
RUNNER thread3 INFO: Thread[thread3,5,main] INFO: Thread[thread2,5,main] INFO: Thread[thread1,5,main] MAIN Thread[main,5,main]
2. Yöntem: Thread Sınıfının Extend Edilmesi • Thread sınıfını extend eden bir sınıf, Thread sınıfının run() metodunu yeniden oluşturarak yürütülecek kodu tanımlar. • Bu sınıf kurucu metodunda iş parçacığını başlatmak için Thread kurucu metodunu super() kullanarak uyarabilir. • Thread sınıfından miras alınan start() metodu iş parçacığını başlatacak olan sınıfta çağrılır.
class ThreadClass extends Thread { private long basla; public ThreadClass(String isim) { super(isim); } public void yaz() { try { for (int i = 0; i < 5; i++) { sleep(500); long simdi = System.currentTimeMillis(); Calendar c = Calendar.getInstance(); c.setTimeInMillis(simdi); System.out.println(getName() + " " + c.getTime().toString()); //System.out.println(getName() + " " + (simdi-basla)); } } catch (Exception ex) { ex.printStackTrace(); } //System.out.println(System.currentTimeMillis()); } public void run(){ yaz(); System.out.println(getName() + " EXITING"); } }
import java.util.Calendar; public class ThreadOrnek { public static void main(String[] args) { long basla = System.currentTimeMillis(); ThreadClass t1 = new ThreadClass("Thread 1"); ThreadClass t2 = new ThreadClass("Thread 2"); ThreadClass t3 = new ThreadClass("Thread 3"); t1.start(); t2.start(); t3.start(); System.out.println("----------------"); long son = System.currentTimeMillis(); System.out.println("GECEN ZAMAN = " + (son-basla)); } }
GECEN ZAMAN = 0 Thread 1 Mon Mar 02 12:51:36 EET 2009 Thread 2 Mon Mar 02 12:51:36 EET 2009 Thread 3 Mon Mar 02 12:51:36 EET 2009 Thread 1 Mon Mar 02 12:51:36 EET 2009 Thread 2 Mon Mar 02 12:51:36 EET 2009 Thread 3 Mon Mar 02 12:51:36 EET 2009 Thread 1 Mon Mar 02 12:51:37 EET 2009 Thread 2 Mon Mar 02 12:51:37 EET 2009 Thread 3 Mon Mar 02 12:51:37 EET 2009 Thread 1 Mon Mar 02 12:51:37 EET 2009 Thread 2 Mon Mar 02 12:51:37 EET 2009 Thread 3 Mon Mar 02 12:51:37 EET 2009 Thread 1 Mon Mar 02 12:51:38 EET 2009 Thread 1 EXITING Thread 2 Mon Mar 02 12:51:38 EET 2009 Thread 2 EXITING Thread 3 Mon Mar 02 12:51:38 EET 2009 Thread 3 EXITING