Java Threads DR GALP AYDIN Java Threads Paracklar

  • Slides: 25
Download presentation
Java Threads DR. GALİP AYDIN

Java Threads DR. GALİP AYDIN

Java Threads (İş Parçacıkları) Multithreading: Program içerisinde aynı anda birden fazla işin yapılabilmesi. Aynı

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 class kullanı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 İş

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

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 Thread t = new BThread(); t. start(); do. More. Stuff();

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff(); Object BThread (extends Thread) BThread() { } void start() { // create thread } void run() { do. Something(); }

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff();

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff(); Object BThread (extends Thread) BThread() { } void start() { // create thread } void run() { do. Something(); }

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff();

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff(); Object BThread (extends Thread) BThread() { } void start() { // create thread } void run() { do. Something(); }

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff();

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff(); Object BThread (extends Thread) BThread() { } void start() { // create thread } void run() { do. Something(); }

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff();

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff(); Object BThread (extends Thread) BThread() { } void start() { // create thread } void run() { do. Something(); }

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff();

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff(); Object BThread (extends Thread) BThread() { } void start() { // create thread } void run() { do. Something(); }

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff();

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff(); Object BThread (extends Thread) BThread() { } void start() { // create thread } void run() { do. Something(); }

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff();

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff(); Object BThread (extends Thread) BThread() { } void start() { // create thread } void run() { do. Something(); }

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff();

Thread Oluşturulması Object A Thread t = new BThread(); t. start(); do. More. Stuff(); Object BThread (extends Thread) BThread() { } void start() { // create thread } void run() { do. Something(); }

İş parçacıklarının oluşturulması Java’da bir iş parçacığı oluşturmak için iki yöntem kullanılır: 1. Runnable

İş parçacıklarının oluşturulması Java’da bir iş parçacığı oluşturmak için iki yöntem kullanılır: 1. Runnable interface kullanmak (java. lang. Runnable) 2. 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()

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(); } •

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: 1.

Not Runnable Bir thread "Not Runnable" durumuna aşağıdaki dört durumdan birisi oluşunca girer: 1. suspend() metod u çağrılınca 2. sleep() metodu çağrılınca 3. Thread wait() metodu kullanarak bir şart değişkenini beklemek için kullanıyorsa 4. I/O için blok olmuşsa.

Thread Lifecycle Active sleep(500) wake up JVM Born start() suspend() resume() Runnable stop() Blocked

Thread Lifecycle Active sleep(500) wake up JVM Born start() suspend() resume() Runnable stop() Blocked wait stop() notify block on I/O Dead I/O available

class Runnable. Thread implements Runnable { public class Runnable. Ornek { public static void

class Runnable. Thread implements Runnable { public class Runnable. Ornek { public static void main(String[] args) { Thread thread 1 = new Thread(new Runnable. Thread(), "thread 1"); Thread thread 2 = new Thread(new Runnable. Thread(), "thread 2"); Runnable. Thread thread 3 = new Runnable. Thread("thread 3"); //Start the threads thread 1. start(); thread 2. start(); try { //delay for one second Thread. current. Thread(). sleep(1000); } catch (Interrupted. Exception e) { } //Display info about the main thread System. out. println("MAIN " + Thread. current. Thread()); } Thread runner; public Runnable. Thread() { } public Runnable. Thread(String thread. Name) { runner = new Thread(this, thread. Name); System. out. println("RUNNER " + runner. get. Name()); runner. start(); } public void run() { System. out. println("INFO: " + Thread. current. Thread()); } } }

RUNNER thread 3 INFO: Thread[thread 3, 5, main] INFO: Thread[thread 2, 5, main] INFO:

RUNNER thread 3 INFO: Thread[thread 3, 5, main] INFO: Thread[thread 2, 5, main] INFO: Thread[thread 1, 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

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. 2. Bu sınıf kurucu metodunda iş parçacığını başlatmak için Thread kurucu metodunu super() kullanarak uyarabilir. 3. Thread sınıfından miras alınan start() metodu iş parçacığını başlatacak olan sınıfta çağrılır. 1.

class Thread. Class extends Thread { private long basla; public Thread. Class(String isim) {

class Thread. Class extends Thread { private long basla; public Thread. Class(String isim) { super(isim); } public void yaz() { try { for (int i = 0; i < 5; i++) { sleep(500); long simdi = System. current. Time. Millis(); Calendar c = Calendar. get. Instance(); c. set. Time. In. Millis(simdi); System. out. println(get. Name() + " " + c. get. Time(). to. String()); //System. out. println(get. Name() + " " + (simdi-basla)); } } catch (Exception ex) { ex. print. Stack. Trace(); } //System. out. println(System. current. Time. Millis()); } public void run(){ yaz(); System. out. println(get. Name() + " EXITING"); } }

import java. util. Calendar; public class Thread. Ornek { public static void main(String[] args)

import java. util. Calendar; public class Thread. Ornek { public static void main(String[] args) { long basla = System. current. Time. Millis(); Thread. Class t 1 = new Thread. Class("Thread 1"); Thread. Class t 2 = new Thread. Class("Thread 2"); Thread. Class t 3 = new Thread. Class("Thread 3"); t 1. start(); t 2. start(); t 3. start(); System. out. println("--------"); long son = System. current. Time. Millis(); System. out. println("GECEN ZAMAN = " + (sonbasla)); } }

GECEN ZAMAN = 0 Thread 1 Mon Mar 02 12: 51: 36 EET 2009

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: 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