• Like
  • Save
Multi Threaded Programming With Java
Upcoming SlideShare
Loading in...5
×
 

Multi Threaded Programming With Java

on

  • 720 views

Multi Threaded Programming With Java

Multi Threaded Programming With Java

Suleyman Demirel Universitesi
Bilgisayar Muhendisligi
Paralel Programlama Dersi Icin Hazirlanmistir.

Statistics

Views

Total Views
720
Views on SlideShare
719
Embed Views
1

Actions

Likes
0
Downloads
10
Comments
0

1 Embed 1

https://twitter.com 1

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Multi Threaded Programming With Java Multi Threaded Programming With Java Document Transcript

    • Sevdanur GENC - 09210120671Suleyman Demirel UniversitesiMuhendislik FakultesiBilgisayar MuhendisligiParalel Programlama DersiSevdanur GENC - 0921012067
    • Sevdanur GENC - 09210120672Paralel ProgramlamaObject Oriented & MultiThreaded Programming With JAVAJavada Threadler object olarak bulunmaktadir. Iki farkli yontemle threadler uzerindecalisabiliriz.1. Standart sinifimizi Thread sinifindan extend ederek.2. Standart sinifimizi Runnable interfaceinden implement ederek.Tum bunlar icin threadlerimizi java diline tanitirken, Java.Lang.Thread sinifini veyaJava.Lang.Runnable interfaceini kullanmamiz gerekmektedir. Thread sinifimizin icerisinde bulunan Run()metodunu kendisinden override edilmistir fakat biz bunu kullanirken public bir sekilde yazmamizgerekmektedir. Ayni zamanda void ile kullanildigindan dolayi baska hic bir argument almadan returntypeini kullanmamiz gerekmektedir. Hem threadler hem de islemciler bu uygulama tarafindansoyutlandirilmis yani abstract haline getirilmistir.Thread Classindan Extend EdilmesiThread, Java.lang.Thread sinifi tarafindan extend edilir ve yine bu sinifin Run() metodu ilethreadlerimizi olusturmus oldugumuz nesnenin start metodunu cagirarak calistiririz.public class Sample01 extends Thread{public void run() {System.out.println("Merhaba Nano");}public static void main(String[] args) {Sample01 thr1 = new Sample01();thr1.start();}}Runnable Interfaceinden Implement EdilmesiOlusturmus oldugumuz thread nesnesini, Thread sinifi icerisindeki constructorin runnablearayuzune direkt olarak uygulayarakta calistirabiliriz.public class Sample02 implements Runnable{public void run() {System.out.println("Merhabalar Nano");}public static void main(String[] args) {Sample02 MyObject = new Sample02();Thread thr1 = new Thread(MyObject);//Thread thr1 = new Thread(new Sample02());thr1.start();}}
    • Sevdanur GENC - 09210120673Thread Sinifinin KullanimiThreadlerimizi calistirabilmemiz icin oncelikle olusturmus oldugumuz sinifi Thread sinifindanextend etmemiz gerekiyor. Olusturmus oldugumuz bu sinif icerisinde tanimlayacagimiz bir threadnesnesi ile birlikte thread sinifina ait start() metodunu kullaniriz. Burada dikkat edilmesi gereken oncelik;her bir start metodu bir tek thread icin calismaktadir. Aksi olabilecek bir durumda RuntimeExceptionhatasi ile karsi kasiya kalirsiniz. Burada anlasilmasi gereken diger bir ayrinti ise; Ayni thread sinifiuzerinde birden fazla nesne olusturabiliriz bununla birlikte her bir nesnenin start() metodu kendisine aitolacaktir. Start() metodu ile birlikte artik, paralelde calismasini istediginiz kodlarini Run() metodunayazabilirsiniz. Start() metodu calistiktan itibaren direk run() metodu icerisindeki kod bloklari aktif halegeliyor olacak. Her bir kanalin kendi icerisinde hangi sirayla calisacagini bilemeyiz. Burada onemli olanrun() metodu icerisindeki verilen gorevlerin zaman icerisinde diger tum kanallarla birlikte calisabiliyorolmasidir.Thread OncelikleriRun() metodu ile birlikte aktif olan tum gorevlerin threadler uzerinde oncelikleri bulunmaktadir.Oncelik degerleri 1den 10a kadar verilebilecek bir degerdir. Oncelikleri tanimlayabilmek ve degerleriniokutabilmek icin kullanacagimiz metodlar;public final int getPriority() ; Threadin onceligini okur.public final int setPriority(int newPriority); Threadin calisma sirasindaki onceliginibelirlemektedir.Oncelikleri belirleyebilmemiz icin uc adet sabit degerimiz bulunmaktadir; Thread.MIN_PRIORITY= 1 , Thread.NORM_PRIORITY = 5 , Thread.MAX_PRIORITY = 10 gibi...Thread Life Cycle State Diagram - Thread Yasam Dongusu ve Durum DiagramiJavada var olan thread durumlarini aciklayacak olursak;New; Yaratmis oldugumuz threadin hazir beklemesi durumudur.Runnable; Yaratmis oldugumuz threadin artik calisir duruma gelmesidir.
    • Sevdanur GENC - 09210120674Blocked; Thread bloklanarak, monitor lock durumu icin bekletilmektedir. Blok tekrar acildiginda yenidenrunnable durumuna gececektir.Waiting; Bir threadin suresiz olarak diger threadlerin yapmis oldugu isleri tamamlayabilmesi icin othreadin bekledigi durumdur.Timed Waiting; Bir threadin diger threadin isini tamamlayabilmesi icin sadece belirli bir sure bekledigidurumdur.Terminated; Threadlerin tum islerinin tamamlandigi ve islemlerin sonlandigi durumdur.Ozetleyecek olursak; Bir thread icin yeni bir nesne olusturulduktan hemen sonra start() metoduile runnable durumuna gecmektedir. Threadlerin ne kadar sure calisacaklarini bilemedigimiz icin egerki,uzun sureli calisan bir thread varsa ve diger threadlerde is eksikligi varsa bunu engelleyebilmek icin uzunsureli calisan threadlere sleep() metodunu kullanabiliriz. Sleep() metodu icerisindeki milisaniyelikverilen degere gore o thread durdurulacak ve diger threadlerin calismasi devam edecektir. Runningstatede olan yani halen calisiyor olan bir thread; wait(), sleep() ve join() metodlari ile blocked state veyawaiting state asamalarina getirtilebilir. Bu asamalarda tek bir thread, Senkronize tanimlanmis bir kodblogu icerisine gonderilerek lock haliyle o kod bloguna baglanmis olur. Thread isini bitirdikten sonra,bekleyen ve siraya giren diger threadlere sira gelir. Egerki, lock haline girmis bir threadin yenidenrunnable duruma gecebilmesi icin sleep veya wait durumlarindan cikmis olmasi gerekir. Threadislemlerini bitirdikten sonra artik terminated durumuna gecerek kendisini oldurur. Bu durumda thread,tekrardan start edilemez hale gelir.Thread Class ve Runnable Interface KarsilastirilmasiAslinda her iki yontemle de ayni seyleri yapiyoruz fakat farkli iki yol kullaniyoruz. Threadsinifindan uretmis oldugumuz nesne sayesinde Thread yasam dongusundeki rolune tamamen hakimolmaktadir. Runnable ise bir arabirim gibi kullanilmaktadir. Sadece bir thread tanimlanir ve o threaduzerinde isler yurutulur fakat tum kontrole hakim olamaz. Diger onemli bir konu ise, Thread sinfindanturetilmis bir sinif icerisinde calisirken baska bir siniftan miras alamaz, cunku turetilmis bir sinif baska birtemel sinifla genisletilemez diyebiliriz. Gerekirse bunun icin Runnable arayuzu kullanilabilir. Kisacasi,eger threadler uzerinde calisirken thread yasam dongusune sahip tam bir kontrole ihtiyaciniz varsathread classinin kullanilmasi iyi bir secenek olacaktir. Eger ki, uygulamaniz icin daha fazla esnek bir yapigerekiyor ve bunun icin diger siniflardan da yardim alinmasi gerekiyorsa, runnable arayuzununkullanilmasi tercih edilmektedir.Thread Sinifi Methodlarinin Kullanimi ve Uygulamalari- On Bilgiler :ClassLoader : Java Virtual Machine yapisinda bulunan Loader yani yukleyici siniflar bulunmaktadir. Buyukleyiciler belli siniflari JVMye yuklerler. Thread sinifi icerisinde ClassLoader sinifinin kalitimi ile kendisinif yukleyicilerimizi yazabiliyor ve sinif yukleme isini ozellestirebiliyoruz. Yukleme isinden kasit,siniflarin onbellege alinmasi ve sonrasinda ise yapilacak isteklere hizli bir cevap verilmesidir diyebiliriz.ThreadGroup: Bir dizi threadin grup halini temsil etmektedir. Ayrica, bir thread grubu diger threadgruplarinida ayni zamanda icerebilir. Thread gruplarini bir tree seklinde dusunursek, her bir threadgrubunun parentlari haric dusunulmektedir. Bir thread kendi bulundugu thread grubuna ait tumbilgilere erisebilmesi icin izinlere sahiptir. Fakat, Parentta bulunan diger bir threadGroupun veyaherhangi bir threadGroupun bilgilerine erismesi engellenmistir.
    • Sevdanur GENC - 09210120675
    • Sevdanur GENC - 09210120676activeCount() Methodu; Gecerli thread grubundaki aktif threadlerin sayisini verir. Int degeri alir.public class Sample01 extends Thread{]public static void main(String[] args) {int count = Thread.activeCount();System.out.println("Aktif Threadler = " + count);}}chechAccess() Metodu; Calisan threadin guvenlik izniniz oldugu muddetce sahip oldugu durumudegistirebilirsiniz.public class Sample02 extends Thread{public void run() {System.out.println("islemler"); }public static void main(String[] args) {Sample02 thr1 = new Sample02();thr1.start();thr1.checkAccess();System.out.println("durumunuz degistirildi");}}clone() Metodu; Bir sinifin nesnesi kolonlanamaz ise bir kolon degeri olusturur.class MyThreadSinifim(){}MyThreadSinifim thr = new MyThreadSinifim ();MyThreadSinifim thrCloned = (MyThreadSinifim) thr.clone();countStackFrame() Metodu; Bu metodun kullanilmasi onerilmemektedir. Bu metodun kullanilmasi ilebirlikte, hic bir zaman sonuclari tutarli olmamistir. Threadler de ki, yigin framelerinin sayisini tutar vethreadi askiya alir.currentThread() Metodu; O anda yurutulen threadin hangisi olduguna dair bilgi verir.public class Sample03 extends Thread{public void run() {System.out.println("islemler"); }public static void main(String[] args) {Sample03 thr1 = new Sample03();thr1.start();System.out.println( Thread.currentThread());}}destroy() Metodu; Bu metodun kullanilmasi onerilmemektedir. Cunku bu method ile, threadinbulundugu konumu imha ederek konum bilgisini silecektir. Sistem uzerindeki kilitlenmelerinkaynaklandigi durumlara bir sebep gosterilebilir. Bu da dondurulmus surecler yani frozen process olarakadlandirilacaktir.
    • Sevdanur GENC - 09210120677dumpStack() Metodu; Bu method sadece debugging islemlerinde kullanilmaktadir. Herhangi bir hatayakalandigi zaman, thread hangi konumdaysa oranin yigin adresi yazdirilir.public class Sample04 extends Thread {public static void main(String args[]) {Thread t = Thread.currentThread();t.setName("My Thread");t.setPriority(1);System.out.println("Aktif olan Thread: " + t);int active = Thread.activeCount();System.out.println("Su an calisan Threads: " + active);Thread all[] = new Thread[active];Thread.enumerate(all);for (int i = 0; i < active; i++) {System.out.println(i + ": " + all[i]);}Thread.dumpStack();}}enumerate() Metodu; Her bir aktif threadin calistigi konumlarda o threadin thread grubu veya threadalt gruplarinin belirtilmis olunan bir diziye kopyalar. Bu method sadece, o an ki aktif threadin bulundugugrubun numaralandirilmasi icin kullanilmaktadir. Eger bu method, checkAccess() methodu ile kullanilirsathread gruplarina guvenli bir sekilde erisilebilir olacaktir. Kisacasi, threadlerin konumlarini bir diziyealmaktadir.public class Sample05 extends Thread{public void run (){for (int i = 0; i < 20; i++)System.out.println ("i = " + i);}public static void main (String [] args){Sample05 thr = new Sample05 ();thr.start ();Thread [] threads = new Thread [Thread.activeCount ()];int n = Thread.enumerate (threads);for (int i = 0; i < n; i++)System.out.println (threads [i].toString ()); }}getAllStackTraces() Metodu; Tum calisan threadlerin yigindaki yerlerini listeyelebilecek bir mapolusturur. Bu mapte key ve value iliskileri bulunmaktadir. Keyler de threadler tutulurken, valuelar daise StackTraceElement bilgileri tutulacaktir. Threadlerin yigindaki yerlerine ulasabilmemiz icingetStackThread methodu kullanilabilir. Yigin konumlari, her bir threadin sadece o anki bulundugu
    • Sevdanur GENC - 09210120678konumun bilgisinden oteye gidemez. Cunku her bir yigin izi, farkli zamanlarda olusturulacaktir. Egerkimap sifir bilgisini gonderirse, sanal makina tarafindan bir threadin yigin izninin olmadigi bilinecektir.public class Sample06 extends Thread {public void run() {System.out.println("This is run() method");}public static void main(String args[]) {Sample06 trace = new Sample06();Thread t = new Thread(trace);t.start();Map allThreads = Thread.getAllStackTraces(); }}getContextClassLoader() Metodu; ClassLoader isimli bir sinifla birlikte baglantilidir. Kod calismayabasladigindan itibaren, ClassLoaderin siniflari ve kaynak kodlari yuklenmeye baslayacak ve threadlerinayarlanmasina yardimci olacaktir. Eger ayarlanmamissa, ClassLoaderda iliskili olan threadler varsayilanolarak kullanilacaktir. Uygulamanizda threadlerin class loader sinifindan yuklenmesi icin class loaderabagimli bir sekilde yuklenilmesi gerekiyor. ilk olarak eger bir guvenlik yonetimi varsa, ve class loadericagirdiginizda null degerindeyse ve class loader, ilisik oldugu sinifin aynisi degil veya atasi degilse ilisikoldugu class loader talep gonderecektir. Sonrasinda guvenlik yonetimi checkPermission metodu,RuntimePermisson("getClassLoader") izni aktif olacak sekilde cagirilir. Eger hersey tamamsa, class loaderile iliskisi saglanmistir.setContextClassLoader(ClassLoader cl) Metodu; ClassLoader sinifina iliskin threadlerin ayarlari yapilir.Bir thread olusturulurken classLoader sinifi tarafindan ayarlanabilir ve thread olusturulmasina izinverildigi an calistirilan kod icin uygun bir classLoader saglandiktan sonra siniflar ve kaynaklaryuklenecektir. Ilk olarak, eger guvenlik yonetisi varsa, checkPermission metoduRuntimePermossin("setContextClassLoader") izinleri ile birlikte cagirilacaktir ve ayarlanmasi yapilacaktir.public class Sample07 extends Thread {Thread t;Sample07() {t = new Thread(this);t.start();}public void run() {ClassLoader c = t.getContextClassLoader();t.setContextClassLoader(c);System.out.println("Class = " + c.getClass());System.out.println("Parent = " + c.getParent());}public static void main(String args[]) {new Sample07 ();}}
    • Sevdanur GENC - 09210120679getDefaultUncaughtExceptionHandler() Metodu; Bir thread birden bire farkedilmemis ozel bir durumlakesintiye ugradiginda, cagirilacak olan varsayilan isleyicidir.setDefaultUncaughtExceptionHandler () Metodu; Bir thread birden bire farkedilmemis ozel bir durumlakesintiye ugradiginda, cagirilacak olan varsayilan isleyicidir. Farkedilen ozel durum, bir thread tarafindanilk olarak kontrol edilir. Sonrasinda, varsayilan yakalanmis ozel durum threadin bulundugu threadGroupnesnesi tarafindan kontrol edilmektedir. Eger thread, yakalanmis ozel bir durum olarak ayarlanmamissa,threadin bulundugu threadGroupu uncaughtException methodu uzerinde ozel olarak degismeyecektir.Sonra, varsayilan handlerin uncaughtException methodunu cagiracaktir. Varsayilan uncaugt exceptionhandleri ayarlayamak, uygulamanin uncaught exceptionlari ele alarak degisiklikler yapabilmemizdir.Zaten threadler sistem tarafindan saglanan varsayilan davranislari kabul edeceklerdir. Unutmamakgerek ki, varsayilan uncaught exception handler genellikle threadin threadGroup nesnesini ertelemekgerektigi icin degildir, sonsuz ozyinelemelere neden olacaktir.public class Sample08 extends Thread{public void run() {throw new RuntimeException();}public static void main(String[] args) {Sample08 t = new Sample08();t.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {public void uncaughtException(Thread t, Throwable e) {System.out.println(t + " throws exception: " + e);}});t.start();}}getName() Metodu; Kullanilan threadin ismini string tipinde veren yontemdir.setName(String name) Metodu; Threadlerin isimlerini bagimsiz bir sekilde degistirebilecegimiz biryontemdir. Arka planda, Oncelikle yine bu islem icin checkAccess metodu cagirilir ve SecurityExceptionbilgisi gondermesine sebep olur.getId() Metodu; Threadlerin konum idlerini veren bir metoddur. Eger bir thread olusturulduysa, threadidsi pozitif bir long sayi tipinde olacaktir. Thread idsi, thread yasam dongusu icerisinde benzersiz ve asladegismeyecek olan bir ifadedir. Thread sonlandirildigi zaman, thread id bu konumu tekrardankullanabilecektir.public class Sample09 extends Thread {Thread t;Sample09() {t = new Thread(this, "Admin Thread");t.setPriority(1);System.out.println("thread = " + t);t.start();}
    • Sevdanur GENC - 092101206710public void run() {System.out.println("Name = " + t.getName());System.out.println("Id = " + t.getId());}public static void main(String args[]) {new Sample09 ();}}getPriority() Metodu; Threadin oncelik degerini int tipinde verir.setPriority(int newPriority) Metodu; Threadlerin onceligini degistirebilmemiz icin gerekli setmetodudur. Yine oncelikle checkAcces yontemi cagirilarak securityException a sebep olur. Aksi takdirde,threadin ayari belirtilen newPriority degerinden daha kucuk olmaldir, ve thread grubundaki maksimumonceligine izin verilmelidir.public class Sample10 extends Thread {public void run() {Sample10 th = new Sample10();System.out.println("Thread Priority : " + th.getPriority());th.setPriority(10);System.out.println("After setting priority, Thread Priority : " + th.getPriority()); }public static void main(String[] args) {Sample10 th = new Sample10();th.start();}}getStackTrace() Metodu; Threadlerin kullanmis oldugu yigin izlerinin bulundugu diziyi listeler. Bumethod sifir olarak geri donus yaparsa, thread henuz calistirilmamis veya sonlandirilmis anlamina gelir.Eger dondurulen deger sifirdan farkli bir degerse, dizinin ilk elemani yiginin en ustunu temsil edecektir, kihangi sirayla en son cagirilirsa cagrilsin farketmeyecek. Yigin listenin en altindaki sonuncu deger, en soncagirilacak yontemi temsil edecektir. Eger guvenlik yoneticisi bulundugunda, thread calismiyorsaguvenlik yoneticisi checkPermissin metodunu cagirarak runtimePermisson("getStackTrace") izni ilegorulebilecek ve gorev tamamlanacaktir. Bazi sanal makinalar, bazi durumlarda bir veya daha fazla yiginizinden yigin framee atlanilacaktir. Diger olaganustu bir durumsa, bir sanal makina ilgili oldugu herhangibir threadin yigin izin bilgisine sahip degildir, thread bu metoddan sifir bilgisini geri dondurmeye izinverecektir.public class Sample11 extends Thread{Sample11 thr ;public void run(){method1();}public static void main(String[] args) {Sample11 t = new Sample11();t.start();}public static void method1(){new Sample11().method2();
    • Sevdanur GENC - 092101206711}public void method2() {System.out.println(thr.currentThread().getStackTrace()[3].getClassName());System.out.println(thr.currentThread().getStackTrace()[3].getFileName());System.out.println(thr.currentThread().getStackTrace()[3].getLineNumber());System.out.println(thr.currentThread().getStackTrace()[3].getMethodName()); }}getState() Metodu; Threadin durum bilgisini verir. Bu metod, sistem durumunun izlenilmesi icntasarlanmistir, senkronizasyon kontrolu icin degil.public class Sample12 extends Thread {Sample12 thread;public void run() {Thread.State state = thread.currentThread().getState();System.out.println(thread.currentThread().getName() + " state is - " + state);}public static void main(String[] args) {Sample12 th = new Sample12();Sample12 th1 = new Sample12();th.start();try {th.sleep(1000);} catch (Exception e) {System.out.println(e);}Thread.State state = th.getState();System.out.println(th.getName() + " state - " + state);System.out.println(th1.getName() + " state - " + th1.getState());th1.start();try {th1.join();} catch (Exception e) {System.out.println(e);}System.out.println(th1.getName() + " state - " + th1.getState()); }}getThreadGroup() Metodu; Threadin ait oldugu thread grubu bilgisini verir. Eger thread calismiyorsayada durdurulmussa donen deger null olacaktir.public class Sample13 extends Thread {Thread t;Sample13() {ThreadGroup tgrp = new ThreadGroup("Thread Group");t = new Thread(tgrp, this);}public void run() {
    • Sevdanur GENC - 092101206712System.out.println(t.getThreadGroup());}public static void main(String[] args) {Sample13 th = new Sample13();th.start(); }}setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) Metodu; Thread, exceptionayakalanmasi sebebiyle sonlandirildiginda isleyicinin vermesi gereken degeri set ederiz. Bir threadin nasiltam kontrol edilebilir olacagi, istisna isleyicisinin almis oldugu set ayari ile istisna isleyicisinin verecegiyanit belirtilmis olur. Bu sekilde bir threadin isleyicisi hakkinda bir set yapilmazsa, threadGroupnesnesinin bir isleyicisi gibi davranir.public class Sample14 extends Thread {public void run() {throw new RuntimeException();}public static void main(String[] args) {Sample14 t = new Sample14();t.setUncaughtExceptionHandler(new demo.UncaughtExceptionHandler() {public void uncaughtException(Thread t, Throwable e) {System.out.println(t + " throws exception: " + e);}});t.start(); }}getUncaughtExceptionHandler() Metodu; Thread, exceptiona yakalanmasi sebebiyle sonlandirildigindaisleyicinin gonderecegi degerdir. Eger thread, thread grubundan bir nesne ise, bu thread exceptiontarafindan yakalanmayacaktir. Thread grup nesnesinin bilgisi geldiginde, thread durdurulmazsa threaddurumu null olarak geri donecektir.public class Sample15 extends Thread {public void run() {Thread t = new Thread();System.out.println("Thread = " + t.getName());Thread.UncaughtExceptionHandler handler = t.getUncaughtExceptionHandler();System.out.println(handler);}public static void main(String[] args) {Sample15 th1 = new Sample15 ();Sample15 th2 = new Sample15 ();th1.start();th2.start(); }}
    • Sevdanur GENC - 092101206713holdsLock(Object obj) Metodu; Sadece ve sadece gecerli threadin belirtilen nesne uzerindeki monitorkilidini tutacaktir. Bu metod, belirli bir threadin kilit bilgisini alip kullanilabilmesinde izin verilmesi icintasarlinmistir.public class Sample16 extends Thread {Thread th;public void run() {System.out.println("Holds Lock = " + Thread.holdsLock(this));synchronized (this) {System.out.println("Holds Lock = " + Thread.holdsLock(this)); }}public static void main(String[] args) {Sample16 th = new Sample16();th.start(); }}interrupt() Metodu; Interrupt kesme konusudur. Gecerli thread, kendisini kesmedigi muddetce, herzaman calisacaktir. Thread, CheckAcces metodunu cagiracaktir ve securityException istisnasini atmasinisaglayacaktir. Eger thread, thread sinifinda kullanilan wait(), wait(long) veya wait(long int) metodlardanbir nesne ile bloke edilirse, veya sinif icerisinde join(), join(long), join(long, int), sleep(long), veyasleep(long, int) kullanilirsa, interruptin durumu temizlenecektir ve interruptedException bilgisialinacaktir. Eger thread giris/cikis kanali uzerinde bloke edildiyse, o kanal artik kapali olacaktir. threadinkesme durumu ayarlanacaktir ve thread ClosedByInterruptException alacaktir. Eger thread, Selectordabloke edilirse, sonrasinda threadin kesme durumu ayarlanacak ve secim isleminden muhtemelen sifirolmayan bir degerle hemen donecektir. Tipki, selectorun calisma metodunun cagirilmasi gibi. Egerki bukosullardan hic biri gerceklesmezse, o zaman o threadin kesme durumu ayarlanabilir. Kesintiye ugrayanbir thread, asla aktifligini koruyamaz ve calisamaz.interrupted() Metodu; Gecerli olan threadin kesilip kesilmedigini kontrol eder. Threadin durumukesilmisse, thread bu metod ile temizlenebilir. Diger bir ifadeyle, Bu metod arka arkada iki kez cagirilacakolsaydi, ikinci cagirilisin sonucunda false degeri aliniyor olacakti. Yani, gecerli thread tekrardancagirilmadigi surece, ikinci kez cagirilmadan once, ilk cagirilisinda kesilme durumunu temizleyecektir.Thread kesintisi goz ardi edilebilir cunku, bir thread ilk kesildigi anda artik calismayacaktir ve metodsayesinde false degeri yansitilacaktir.isInterrupted() Metodu; Threadin kesintiye ugrayip ugramadigi kontrol edilmistir. Threadin kesilmedurumu, bu metod tarafindan belirlenmez. Kesilen bir threadin calisip calismadigi goz ardi edilebilircunku, thread calismadiginda dair durumunu kesilme aninda bu metod ile false degerini vererekyansitacaktir.public class Sample17 extends Object implements Runnable {public void run() {try {System.out.println("in run() - about to work2()");work2();System.out.println("in run() - back from work2()"); }catch (InterruptedException x) {System.out.println("in run() - interrupted in work2()");
    • Sevdanur GENC - 092101206714return; }System.out.println("in run() - doing stuff after nap");System.out.println("in run() - leaving normally"); }public void work2() throws InterruptedException {while (true) {if (Thread.currentThread().isInterrupted()) {System.out.println("C isInterrupted()=" + Thread.currentThread().isInterrupted());Thread.sleep(2000);System.out.println("D isInterrupted()=" + Thread.currentThread().isInterrupted()) } }}public void work() throws InterruptedException {while (true) {for (int i = 0; i < 100000; i++) {int j = i * 2;}System.out.println("A isInterrupted()=" + Thread.currentThread().isInterrupted());if (Thread.interrupted()) {System.out.println("B isInterrupted()=" + Thread.currentThread().isInterrupted());throw new InterruptedException(); }} }public static void main(String[] args) {Sample17 si = new Sample17();Thread t = new Thread(si);t.start();try {Thread.sleep(2000);}catch (InterruptedException x) {}System.out.println("in main() - interrupting other thread");t.interrupt();System.out.println("in main() - leaving"); }}isAlive() Metodu; Threadin halen daha calisip calismadigi kontrol ediliyor. Eger thread calisiyorsa, yacalismak icin baslatilmistir yada durdurulmamistir.public class Sample18 extends Thread {public void run() {for (int i = 0; i < 10; i++) {printMsg(); }}public void printMsg() {Thread t = Thread.currentThread();String name = t.getName();System.out.println("name=" + name);}public static void main(String[] args) {
    • Sevdanur GENC - 092101206715Sample18 tt = new Sample18();tt.setName("Thread");System.out.println("before start(),tt.isAlive()=" + tt.isAlive());tt.start();System.out.println("just after start(), tt.isAlive()=" + tt.isAlive());for (int i = 0; i < 10; i++) {tt.printMsg(); }System.out.println("The end of main(),tt.isAlive()=" + tt.isAlive());}}isDaemon() Metodu; Thread, bir hasara ugramistir. calismiyorsa..setDaemon() Metodu; Ya bir daemon threadini ya da kullanilan bir threadi isaret eden bir metoddur.Tum daemon threadlerinde calisan bir thread oldugunda JVM sonlanacaktir. Bu method onceliklethread basladiktan sonra cagirilir. Bu methodla birlikte ilk kullanilacak method parametresiz bir threadeait checkAccess metodudur. Mevcut threadde calistiginda ise, bir SecurtiyException sonucuna sebepolacaktir.join() Metodu; Calismayan threadlerin calismasi icin harekete geciren bir yontemdir.join(long millis) Metodu; mills parametresi ile calismayan threadlerin calismasi icin milisaniyede birdegerle harekete gecer.join(long millis, int nanos) Metodu; Calismayan bir threadin calismasi icin her bir milisaniyede,nanosaniyeye ozen gostererek harekete gecirecektir.public class Sample19 implements Runnable {public void run() {Thread t = Thread.currentThread();System.out.print(t.getName());System.out.println(", status = " + t.isAlive());}public static void main(String args[]) throws Exception {Thread t = new Thread(new Sample19());t.start();t.join();System.out.print(t.getName());System.out.println(", status = " + t.isAlive());}}resume() Metodu; Onerilmeyen bir yontemdir. Bu metod, yalnizca suspend() kullanimi icinvarolmaktadir. Threadin deadlock egilimli olmasindan dolayi onerilmemektedir. Ilk olarak, threadincheckAccess metodu, argumansiz cagirilir. Mevcut threadin sebep oldugu sonuc SecurityExceptiondir.Eger thread askida kalacak sekilde hala calisiyorsa, tekrar yurutulebilmesi icin izin verilir ve calismayadevam eder. (kaldigi yerden devam edecektir.)
    • Sevdanur GENC - 092101206716run() Metodu; Ayri bir Runable calisma nesnesi kullanilarak thread calistirilmaktadir. Bu, Runablenesnesinin run metodu bilinir. Aksi halde, bu metod alt siniflar override edilmezsse, calismayacak vedeger gondermeyecektir.start() Metodu; Java Virtual Machine threadi run metodunu cagiracaktir, run metodunun baslayabilmesiicinse gerek olan komutu start metodu verecektir. Sonucta iki thread ayni anda calisiyor olabilir. Bunlargecerli thread (start metodu ile cagirilan) ve diger thread (run metodu ile cagirilan)dir. Bu birden fazlathreadi calistirmak icin gecerli degildir. Ozellikle, bir threadin yurutulmesi tamamlandiktan sonra birkereligine bile olsa yeniden baslayamaz.sleep(long millis) Metodu; Bu metodla, calisilan threadin belirtilen milisaniyelerde gecici olarakdurdurulmasi saglanir. Bu esnada, sistemin zamanlamasi hassasiyet ve dogruluk gostermektedir. Threadherhangi bir izleme kaybi kaybetmeyecektir.sleep(long millis, int nanos) Metodu; Threadlerin yurutulmesi durdurulmasi icin milisaniyenin her birnanosaniyesine gore calismaktadir. Bu esnada, sistemin zamanlamasi hassasiyet ve dogrulukgostermektedir. Thread herhangi bir izleme kaybi kaybetmeyecektir.public class Sample20 implements Runnable {Thread t;public void run() {for (int i = 10; i < 13; i++) {System.out.println(Thread.currentThread().getName() + " " + i);try {Thread.sleep(1000);} catch (Exception e) {System.out.println(e); }} }public static void main(String[] args) throws Exception {Thread t = new Thread(new Sample20());t.start();Thread t2 = new Thread(new Sample20());t2.start();}}stop() Metodu; Onerilmemektedir. Guvenli bir method degildir. Bu methodla threadlerindurdurulmasini saglayalim derken gerekli olan tum akisi kilitleyerek bozabiliriz. Dogal olarakta sonucu birexception olarak gonderecektir. Eger daha onceden herhangi bir nesnenin korunmasi icin izlenilmesindetutarsiz bir durum gozlenseydi, hasarli olan nesne diger threadlere gorunur hale gelecektir. Tamamenkeyfi davranacaktir. Birden fazla kullanilan stop metodu kod icerisinde sadece calisan threadindurdurulmasi icin gerekli bilgiyi bazi degerlerinde degistirmesi gerekir. Hedef thread, duzenli bir sekildebu degisen degeri kontrol eder, ve eger run metodu ile calismasinin durdurulmasi gerekecek bir durumvarsa bir deger gonderecektir. Hedef thread oldukca uzun bir zaman bekleyecektir (ornegin bir kosuldegiskeni kadar), interrupt metodu kesme islemi icin kullanilmalidir.
    • Sevdanur GENC - 092101206717toString() Metodu; Bir threadin temsili olarak string verilerini diziye alir. Bu veriler; Threadin ismi,onceligi ve bulundugu ThreadGroup bilgileri olabilir.suspend() Metodu; Onerilmemektedir. Sistemi direkt dogal bir sekilde kitlemeye neden olacagi icin buyontemin kullanilmasi tercih edilmemektedir. Eger hedef thread, kritik bir sistemin kaynagindaykenmonitor isleminde bir kilit tutarsa, bunu askiya alacaktir. Thread bu kaynaga erisirene kadar Hedefthread devam edecektir. Eger thread, hedef threadin gecmis girisimlerini monitorde kilitleyecegi icinonceki kilitleme sonuclari kaybolacaktir. Bu kilitlenme genellikle, dondurulmuz (frozen process)sureclerde kendini gosterecektir. Askiya alinan thread oncelikle, checkAccess methodu tarafindna hic birparametre kullanilmadan cagirilmaktadir. Sonuc olarak, SecurityException bilgisi alinacaktir. Eger threadhala canliysa, bu thread askiya alinmistir ve devam ettigi surece daha fazla ilerleyemeyecektir.yield() Metodu; Calisan bir Threadin nesnesini gecici olarak durdurmak icin kullanilmaktadir. Ardindandiger threadlerin calismasina olanak verecektir.public class Sample21 implements Runnable {Thread t;Sample21(String str) {t = new Thread(this, str);t.start();}public void run() {for (int i = 0; i < 5; i++) {if ((i % 5) == 0) {System.out.println(Thread.currentThread().getName() + " yielding control...");Thread.yield(); }}System.out.println(Thread.currentThread().getName() + " has finished executing."); }public static void main(String[] args) {new Sample21("Thread 1");new Sample21("Thread 2");new Sample21("Thread 3");new Sample21("Thread 4"); }}Sik Kullanilan Methodlarstart(); Thread tarafindan calistirilan bu method, threadin islemleri gerceklestirmesi icin hareketegecmesini saglar. Bir nevi hazirlik asamasidir.run(); Threadin yapmasi gerektigi islemleri yerine getirebilecegi bir methodtur. Direkt olarak calismaz,ancak start() methodu tarafindan aktif bir sekilde cagirilir.stop(); Threadi tamamen oldurur yani durdurur. Sonrasinda yeniden calistrmak icin start methoduverilmelidir. Bunun icin destroy() methoduda kullanilabilir.wait(); Threadi bekleme modundadir. Yeniden uyarilana kadar yada bekleme suresi bitene kadarbekleyecektir.notify(); Bekleme durumundaki Threadi uyarir ve Thread artik hazirlik moduna gecer.sleep(); Wait metodu seklinde calisacaktir, Fakat uyku modundaki thread Interrrupt() metodu ileuyandirilmaktadir.
    • Sevdanur GENC - 092101206718interrupt(); sleep() yada wait() methodlari ile uyandirilmis yada beklemeye alinmis threadleriuyandirmak, tekrar aktif hale getirmek icin kullanilir. Threadin kesme durumunda olup olmadiginiisInterrupted() methodu ile kontrol edebiliriz.yield(); Bir threadin calisma aninda diger threadlerin calisma onceliklerini kontrol ederek kendisini anlikbir sekilde bekletip digerlerinin calismasina izin verecektir.join(); Belirtilecek olan threadin vermis oldugumuz zaman parametresi ile yada o threadin olumunekadar beklemesini saglariz.isAlive(); Calisan thread hala aktif mi degil mi kontrol eden bir methodtur. Threadi pasif halegetirebilmek icin, sleep(long) methodunu kullaniriz. Aktif hale getirebilmesi icin uyarmamizgerekmektedir bunun icinde, notify() methodu kullanilir.Threadler de SenkronizasyonEger threadlerinizden birisi veriyi okumaya calisiyor ve diger herhangi bir threadiniz ayni veriyiguncellemeye calisiyorsa, malesef bu durum paylasilan bilgi icin tutarsiz bir durum sergileyecektir cunkuread / write sorununu ortaya cikmis olacaktir. Bu sorunu Javanin Synchronized anahtari ile giderebiliriz,bunun sayesinde artik verilere senkronizasyonla duzenli ve verimli bir sekilde erisim saglanabilecektir.public synchronized void Method_Name() {kod blogu} seklinde kullanacagimiz methodlarsayesinde yazmis oldugumuz kod bloklarina ayni anda birden fazla threadin girmesini engellemek icingelistirilmis bir methodtur. Bu method olusturulurken synchronized anahtar kelimesi kullanilmistir.Senkronizasyon islemini sadece kod blogunda degilde sadece belirli kod satirinda kullanmak istiyorsak busefer de, o tanimlanacak kod blogu icin synchronized anahtar kelimesini kullaniriz. Bunun icinsynchronized (variable){kod blogu} seklinde kullanabiliriz. Bu kod bloklarinin icerisinde sleep()metodunun kullanilmasinin bir anlami yoktur cunku sirada bekleyen diger thread, blok icerisindencikamayan thread icin beklemeye devam edecektir.Javada Thread Monitor KavramiThread Monitor, JVM yani Java sanal makinesi icin kullanilan threadlerin durumlarinigozleyebilmemiz icin gelistirilmistir. Monitor islemi, javada var olan her bir nesne icin gecerlidir. ThreadMonitor ile, senkronizasyona ugramis methodlara sahip nesneleri ozel erisimi zorlayarak cagiracaktir. Birthread senkronizasyona ugramis bir methoda sahip nesneyi cagirdigi zaman, JVM o nesne icin monitorislemini gerceklestirecektir. Monitor bostaysa, sahibi cagirilan thread tarafindan atanmis olur. Bu dadaha sonrasinda, methodlarin devamliligi ile ilgili cagrisina izin verecektir. Eger monitor baska birthreade ait ise, cagirilan thread, monitor kullanilabilir hale gelene kadar beklemeye devam edecektir. Taki, thread senkronizasyon methodundan cikana kadar. bu da, threadin kendi senkronizasyonmethodunu cagirmasiyla birlikte beklemede bulundugunun bir cagrisini yapmis anlamina gelmektedir.