Obyektif Praktikum : Mendefiniskan threads Mengerti perbedaan state dalam threads Mengerti konsep prioritas dalam threads PERTEMUAN 7 MULTITHREADED PROGRAMMING Mengetahui bagaimana menggunakan method didalam class Thread Membuat sendiri sebuah thread Menggunakan sinkronisasi pada thread yang bekerja bersama-sama dan saling bergantung satu dengan yang lainya Memungkinkan thread untuk dapat berkomunikasi dengan thread lain yang sedang berjalan Mengerti dan menggunakan kemampuan concurency 1
MULTITHREADING DAN THREAD Multithreading adalah suatu kemampuan yang memungkinkan beberapa kumpulan instruksi atau proses dapat dijalankan secara bersamaan dalam sebuah program. Satu kumpulan instruksi yang akan dieksekusi secara independen dinamakan thread. Keuntungan Multithreading : Responsif Ekonomis Utilitas Arsitktur multiprosesor Kerugian Multithreading : Jika digunakan secara berlebihan, multithreading akan berdampak pada pemborosan resource dan CPU yang dialokasikan untuk switching threads. Sistem yang memiliki kecepatan prosesor dan memory yang cenderung sama, sehingga tidak ada efisiensi yang hilang (mengacu kepada latency), tidak akan memperoleh peningkatan bandwidth yang signifikan jika menggunakan multithreading. Multithreading menghasilkan program yang lebih kompleks. Thread yang banyak bisa saling berinterferensi ketika saling berbagi sumber daya hardware seperti cache. 2
PEMBUATAN THREAD Sebuah thread memungkinkan untuk memiliki beberapa state : 1. Running Sebuah thread yang pada saat ini sedang dieksekusi dan didalam control dari CPU. 2. Ready to run Thread yang sudah siap untuk dieksekusi, tetapi masih belum ada kesempatan untuk melakukannya. 3. Resumed Setelah sebelumnya di block atau diberhentikan sementara, state ini kemudian siap untuk dijalankan. 4. Suspended Sebuah thread yang berhenti sementara, dan kemudian memperbolehkan CPU untuk menjalankan thread lain bekerja. 5. Blocked Sebuah thread yang di-block merupakan sebuah thread yang tidak mampu berjalan, karena ia akan menunggu sebuah resource tersedia atau sebuah event terjadi. 3
Pembentukan Thread Ada dua cara untuk membuat thread di program Java, yaitu : extends kelas Thread dan implements interface Runnable. Interface Runnable didefinisikan sebagai berikut: public interface Runnable public abstract void run(); a) Extends kelas Thread Kelas Thread secara implisit juga meng-implements interface Runnable. Oleh karena itu, setiap kelas yang diturunkan dari kelas Thread juga harus mendefinisikan method run(). Berikut ini adalah contoh kelas yang menggunakan cara pertama untuk membuat thread, yaitu dengan meng-extends kelas Thread. class CobaThread1 extends Thread public void run() for (int ii = 0; ii<4; ii++) System.out.println("Ini CobaThread1"); Test.istirohat(11); 4
Pembentukan Thread b) Implements interface Runnable Adanya kekurangan yang cukup fatal pada metode extends, maka cara kedua, yaitu mengimplements interface Runnable, lebih umum digunakan, karena kita bisa mengimplements dari banyak kelas sekaligus. Contoh : class CobaThread2 implements Runnable public void run() for(int ii = 0; ii<4; ii++) System.out.println("Ini CobaThread2"); Test.istirohat(7); public class Test public static void main (String[] args) Thread t1 = new CobaThread1(); Thread t2 = new Thread (new CobaThread2()); t1.start(); t2.start(); for (int ii = 0; ii<8; ii++) System.out.println("Thread UTAMA"); istirohat(5); public static void istirohat(int tunda) try Thread.sleep(tunda*100); catch(interruptedexception e) 5
newborn Daur Hidup Thread thread diinstantiasi, sebuah ruangan di telah dialokasikan untuk thread ini dan telah menyelesaikan tahap inisialisasi. Pada state ini, timerthread belum masuk dalam skema penjadwalan. Thread coba = new Thread ( ); Runnable Sebuah thread berada dalam skema penjadwalan akan tetapi dia tidak sedang beraksi. coba.start() Running Pada state ini, thread sedang beraksi. Jatah waktu beraksi ditentukan oleh thread scheduler. Thread yang berada dalam state ini dapat juga lengser secara sukarela, dan masuk kembali ke status runnable, sehingga thread lain yang sedang menunngu giliran memperoleh kesempatan untuk beraksi. Tindakan thread yang lengser secara sukarela disebut dengan yield-ing. public void run ( ) Thread.yield(); 6
Blocked Daur Hidup Thread Pada tahap ini thread sedang tidak beraksi dan diabaikan dalam penjadwalan. Suatu thread terblok jika : a) Thread itu tidur untuk jangka waktu tertentu. Thread.sleep(3000); // tidur selama 3000milisecond = 3 menit. b) Thread itu di-suspend( ) Thread yang ter-suspend bisa masuk kembali ke ruunable bila ia di resume. timerthread.suspend( ); // thread memasuki state blok timerthread.resume( ); // thread memasuki state runnable c) Thread tersebut memanggil method wait( ) dari suatu objek yang sedang ia kunci. Thread tersebut bisa kembali ke ruunable bila ada thread lain yang memanggil method notify( ) atau notifyall( ) dari objek tersebut. d) Bila thread ini menunggu selesainya aktivitas yang berhubungan dengan I/O. e) Bila thread mencoba mengakses critical section dari suatu objek yang sedang dikunci oleh thread lain. Critical section adalah segmen dalam kode, bisa berupa method maupun blok dimana beberapa thread yang berbeda mengakses objek yang sama. Dead Suatu thread secara otomatis disebut mati bila method run()-nya sudah diselesaikan. Suatu thread juga bisa dead bila ia di stop( ). 7
Daur Hidup Thread Keberadaan sebuah thread dimulai tepat ketika thread tersebut diciptakan. Sebuah thread dieksekusi sampai salah satu kondisi berikut terjadi: 1. Eksekusi terhadap run() berakhir, 2. Terinterupsi oleh eksepsi yang tidak tertangkap, 3. Metode stop() dipanggil. Thread pada Java ditangani melalui dua mekanisme : Cara pertama dilakukan dengan memperluas kelas Thread. Cara kedua dilakukan dengan mengimplementasikan Runnable. 8
Daur Hidup Thread Thread dengan membuat subclass dari java.lang.thread : public class Coba1 extends Thread String nama; coba1(string nm) nama = nm ; public void run ( ) for(int i = 0; i<100; i++) System.out.print (nama); 9
Daur Hidup Thread public static void main (String args[ ]) Thread t = Thread.currentThread();//mendapatkan thread yg sedang berjalan System.out.println(t); t.setname( Threadku ); System.out.prinln(t); //merubah nama thread coba1 t1 = new coba1( A ); coba1 t2 = new coba1( B ); coba1 t3 = new coba1( C ); t1.start(); //mejalankan method run t2.start(); t3.start(); Output dari program diatas : Misal : Thread[main,5,main] Thread[Threadku,5,main] AAAAAAAABBCCCCBCABBCCABB BBCCBC.AABBBB 10
Daur Hidup Thread Thread dengan mengimplementasikan Interface Runnable Bentuk : Thread objek = new Thread(Objekrunnable,<String name>); Objek.start(); atau new Thread(Objekrunnable,<String name>).start(); Contoh : public class Coba2 implements Runnable String nama; Coba2 (String nm) nama=nm; Thread objek = new Thread(this) ; objek.start(); public void run ( ) for(int i = 0; i<100;i++) System.out.print (nama); public static void main (String args[ ]) Coba2 t1 = new Coba2( A ); Coba2 t2 = new Coba2( B ); KET : untuk menjalankan thread, lakukan dengan Coba2 t3 = new Coba2( C ); memanggil method start(). Saat start() dijalankan maka sebenarnya mehod run() dari class dijalankan. 11
Daur Hidup Thread Jenis thread ada dua,yaitu : a) Daemon merupakan thread yang siklus hidupnya tergantung pada thread utama (main). Bila thread induk berakhir, maka thread daemon juga berakhir. b) User merupakan thread yang memiliki siklus tidak tergantung pada siklus thread utama. apabila thread utama berakhir maka user thread akan terus dijalankan. Contoh : import java.io.*; public class user extends Thread String nama; user(string nm) super(nm); /**menjalankan thread dengan sekali instantiasi*/ nama = nm ; start(); public void run ( ) while(true) System.out.print (nama); public static void main (String args[ ]) user t1 = new user("a"); user t2 = new user("b"); user t3 = new user("c"); try System.in.read(); System.out.println(" Tombol enter ditekan"); catch(ioexception o) System.out.println(o); System.out.println("selesai"); 12
Sinkronisasi & Prioritas Thread Sinkronisasi satu atau lebih thread membutuhkan akses yang hampir bersamaan ke suatu sumber daya terbagi, maka thread-thread tersebut perlu sangat memperhatikan agar hanya ada satu yang mengakses dalam satu saat. Bentuk Umum : synchronize(<object>) //satemen yang akan disinkronisasikan Contoh Synchronized pertama class hasil static void cetak(string str1, String str2) try System.out.print (str1); Thread.sleep(1000); System.out.println(str2); catch(exception e) System.out.println(e); 13
Sinkronisasi & Prioritas Thread public class Coba2 implements Runnable String nama,angka; Coba2 (String str1, String str2) nama=str1; angka=str2 ; new Thread(this); //membuat objk thread (new born) objek.start(); public void run ( ) hasil.cetak(str1,str2) ; public static void main (String args[ ]) new Coba2("A","1"); new Coba2("B","2"); new Coba2("C","3"); Output : ABC1 2 3 14
Sinkronisasi & Prioritas Thread Komunikasi Thread wait : memberitahukan thread yang berlaku untuk menyerahkan monitor dan beristirahat sampai suatu jalinan lain memasuki monitor. Notify : membangunkan jalinan pertama yang memanggil wait pada objek yang sama. notifyall :membangunkan semua objek yang memanggil wait pada objek yang sama. Thread dengan prioritas tertinggi yang bangun akan jalan terlebih dahulu. Method cflass thread : Thread.currentThread() menghasilkan objek thread berupa thread yang sedang berjalan. Thread.yield() Menyebabkan runtime mengalihkan konteks dari thread yang berlaku ke thread lain tersedia dan dapat dijalankan. Thread.sleep(int n) Menyebabkan thread yang berlaku beristirahat selam n milidetik. yang 15
Method instans : Sinkronisasi & Prioritas Thread start() Memberitahukan runtime java untuk menciptakan konteks jalinan dan menjalankannya. run() Metod run adalah badan thread yang berjalan. stop() Menyebabkan thread segera berhenti. suspend() Suspend mengambil thread tertentu dan menyebabkanya berhenti tanpa menghancurkan thread system yang berjalan sebelumnya. resume() Digunakan untuk menghidupkan method yang di-suspend. setpriority(int p) mengisiprioritas suatu thread dengan besaran integer. Ada beberapa konstanta priority, yaitu MIN_PRIORITY, NORM_PRIORITY, dan MAX_PRIORITY, secara berurutan bernilai 1,5,10. getpriority() menghasilkan prioritas thread, berupa suatu nilai antara 1 sampai 10. setname(string name) Mengulang pemberian nama thread sesuai dengan argument name. 16
Contoh Program Priority Thread class Tr11 extends Thread String nama; Tr11(String nm)nama=nm; public void run() try while(true) System.out.println("Namaku: "+nama); sleep(1000); catch(interruptedexception e); Output : public static void main(string[] arg) C:\JAVA\bin>java Th5 Thread t1=new Tr11("JOKO"); Halo saya Thread : Merlot Halo saya Thread : Pinot Thread t2=new Tr11("BUDI"); Halo saya Thread : Cabernet t1.start(); t2.start(); System.out.println("Prioritas t1 = "+t1.getpriority()); System.out.println("Prioritas t2 = "+t1.getpriority()); t2.setpriority(1); 17
Contoh Program Sederhana Thread class Grape extends Thread Grape(String s)super(s); //constructor public void run() System.out.println("Halo saya Thread :"+super.getname()); class Th5 public static void main(string[] args) Grape g1=new Grape("Merlot"); Grape g2=new Grape("Pinot"); Grape g3=new Grape("Cabernet"); g1.start(); g2.start(); g3.start(); 18
Latihan Program Berikut ini adalah contoh program sederhana menggunakan thread. Ikutilah langkah-langkah berikut : Step 1 : Buka dan ketikan program pada teks editor notepad++ Anda. Simpan nama file pertama sama seperti nama classnya, yaitu : MyThread.java Misal disimpan pada direktori D folder praktikan MyThread.java Ketikkan program berikut pada teks editor Anda. class thethread implements Runnable Thread t; thethread() t = new Thread(this, "DemoThread"); System.out.println("Child Thead : " + t); t.start(); 19
*Buatlah method run yang bersifat public dan tidak mengembalikan nilai try *Buatlah perulangan menggunakan for dengan inisialisasi i = 5, syaratnya i lebih besar dari nol, dan stepnya decrement i (i--) System.out.println("Child Thread : " + i); Thread.sleep(500); catch(interruptedexception e) System.out.println("Child Interrupted"); System.out.println("Exiting Child Thread"); 20
//program utama *Deklarasikan Class public static void main(string args[]) new thethread(); try for(int i=5;i>0;i--) *Cetak main thread ("Main Thread : " + i); Thread.sleep(1000); catch(interruptedexception e) System.out.println("main Interrupted"); System.out.println("Exiting Main Thread"); 21
Step 2 : Ikuti langkah berikut untuk meng-compile program yang telah Anda buat. Buka command prompt Anda. Masuk ke direktori dan folder tempat program tersebut disimpan. Misal program disimpan pada direktori D folder praktikan Perintah masuk/pindah ke direktori D, ketik D: Perintah masuk ke folder praktikan, ketik cd<spasi>praktikan Setelah masuk ke direktori dan folder yang dituju, untuk meng-compile program Anda ketikkan perintah : Contoh : Step 3 : javac<spasi> MyThread.java javac MyThread.java Untuk menjalankan program yang telah Anda buat, ketikkan perintah : Contoh : java<spasi>namafile java MyThread 22
Tampilan Output 23
Koreksi Latihan Program class thethread implements Runnable Thread t; thethread() t = new Thread(this, "DemoThread"); System.out.println("Child Thead : " + t); t.start(); // Membuat method run yang bersifat public dan tidak mengembalikan nilai public void run() try for(int i=5;i>0;i--) System.out.println("Child Thread : " + i); Thread.sleep(500); catch(interruptedexception e) 24
System.out.println("Child Interrupted"); System.out.println("Exiting Child Thread"); class MyThread //program utama public static void main(string args[]) new thethread(); try for(int i=5;i>0;i--) System.out.println("Main Thread : " + i); Thread.sleep(1000); catch(interruptedexception e) System.out.println("main Interrupted"); System.out.println("Exiting Main Thread"); 25