Java Threads 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 • İş 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 İş parçacıklarının oluşturulması • Java’da bir iş parçacığı oluşturmak için iki yöntem: • Runnable interface kullanarak (java.lang.Runnable) • Thread sınıfını extend ederek (java.lang.Thread) Runnable The Runnable Interface Signature public interface Runnable { void run(); } • 1. A class implements the Runnable interface, providing the run() method that will be executed by the thread. An object of this class is a Runnable object. • 2. An object of Thread class is created by passing a Runnable object as argument to the Thread constructor. The Thread object now has a Runnable object that implements the run() method. • 3. The start() method is invoked on the Thread object created in the previous step. The start() method returns immediately after a thread has been spawned. • 4. The thread ends when the run() method ends, either by normal completion or by throwing an uncaught exception. • A thread enters the "Not Runnable" state when one of these four events occur: • someone calls its suspend() method • someone calls its sleep() method • the thread uses its wait() method to wait on a condition variable • the thread is blocking on I/O. class RunnableThread implements Runnable { 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(Thread.currentThread()); } Thread runner; public RunnableThread() { } public RunnableThread(String threadName) { runner = new Thread(this, threadName); // (1) Create a new thread. System.out.println(runner.getName()); runner.start(); // (2) Start the thread. } public void run() { //Display info about this particular thread System.out.println(Thread.currentThread()); } } } Extending Thread Class 1. 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. class ThreadClass extends Thread { private long basla; public ThreadClass(String isim) { super(isim); } public void yaz() { try { for (int i = 0; i < 10; i++) { sleep(500); long simdi = System.currentTimeMillis(); System.out.println(getName() + " " + (simdibasla)); } } catch (Exception ex) { ex.printStackTrace(); } System.out.println(System.currentTimeMillis() ); } public void run(){ yaz(); } } public class ThreadOrnek { public static void main(String[] args) { long basla = System.currentTimeMillis(); System.out.println(basla); 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("----------------"); // t1.yaz(); // t2.yaz(); // t3.yaz(); long son = System.currentTimeMillis(); System.out.println("GECEN ZAMAN = " + (son-basla)); Long a = new Long("1204845710750"); Long b = new Long("1204845705734"); System.out.println((a.longValue()b.longValue())); } • • • • • thread3 Thread[thread3,5,main] Thread[thread1,5,main] Thread[thread2,5,main] Thread[main,5,main]