İş Parçacıkları

advertisement
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
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
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();
doMoreStuff();
Object BThread (extends Thread)
BThread() {
}
void start() {
// create thread
}
void run() {
doSomething();
}
Thread Oluşturulması
Object A
Object BThread (extends Thread)
BThread() {
}
Thread t = new BThread();
t.start();
void start() {
// create thread
}
doMoreStuff();
void run() {
doSomething();
}
Thread Oluşturulması
Object A
Object BThread (extends Thread)
BThread() {
}
Thread t = new BThread();
t.start();
void start() {
// create thread
}
doMoreStuff();
void run() {
doSomething();
}
Thread Oluşturulması
Object A
Object BThread (extends Thread)
BThread() {
}
Thread t = new BThread();
t.start();
void start() {
// create thread
}
doMoreStuff();
void run() {
doSomething();
}
Thread Oluşturulması
Object A
Object BThread (extends Thread)
BThread() {
}
Thread t = new BThread();
t.start();
void start() {
// create thread
}
doMoreStuff();
void run() {
doSomething();
}
Thread Oluşturulması
Object A
Object BThread (extends Thread)
BThread() {
}
Thread t = new BThread();
t.start();
void start() {
// create thread
}
doMoreStuff();
void run() {
doSomething();
}
Thread Oluşturulması
Object A
Object BThread (extends Thread)
BThread() {
}
Thread t = new BThread();
t.start();
void start() {
// create thread
}
doMoreStuff();
void run() {
doSomething();
}
Thread Oluşturulması
Object A
Object BThread (extends Thread)
BThread() {
}
Thread t = new BThread();
t.start();
void start() {
// create thread
}
doMoreStuff();
void run() {
doSomething();
}
Thread Oluşturulması
Object A
Object BThread (extends Thread)
BThread() {
}
Thread t = new BThread();
t.start();
void start() {
// create thread
}
doMoreStuff();
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:
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() 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:
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
wait
stop()
notify
block on I/O
Dead
I/O available
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("MAIN " +
Thread.currentThread());
}
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.
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 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 = " + (sonbasla));
}
}
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
Download