1 Obyektif Praktikum : Mendefiniskan threads Mengerti perbedaan state dalam threads Mengerti konsep prioritas dalam threads PERTEMUAN 7 MULTITHREADED ...
PERTEMUAN 7 MULTITHREADED PROGRAMMING Obyektif Praktikum : y
Mendefiniskan threads
y
Mengerti perbedaan state dalam threads
y
Mengerti konsep prioritas dalam threads
y
Mengetahui bagaimana menggunakan method didalam class Thread
y
Membuat sendiri sebuah thread
y
Menggunakan sinkronisasi pada thread yang bekerja bersama-sama dan saling bergantung satu dengan yang lainya
y
Memungkinkan thread untuk dapat berkomunikasi dengan thread lain yang sedang berjalan
y
Mengerti dan menggunakan kemampuan concurency
Pemrograman Berbasis Objek - 2011
1
MULTITHREADING DAN THREAD y
Multithreading adalah suatu kemampuan yang memungkinkan beberapa kumpulan instruksi atau proses dapat dijalankan secara bersamaan dalam sebuah program.
y
Satu kumpulan instruksi yang akan dieksekusi secara independen dinamakan thread.
y
Keuntungan Multithreading :
y
¾
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.
Pemrograman Berbasis Objek - 2011
2
PEMBUATAN THREAD y
Sebuah thread memungkinkan untuk memiliki beberapa state : 1.
Running Sebuah thread yang pada saat ini sedang dieksekusi dan didalam control dari
2.
CPU.
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 ia akan menunggu sebuah resource tersedia atau sebuah event terjadi.
berjalan, karena
Pemrograman Berbasis Objek - 2011
3
Pembentukan Thread y
Ada dua cara untuk membuat thread di program Java, yaitu : extends kelas Thread dan implements interface Runnable.
y
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); } } } Pemrograman Berbasis Objek - 2011
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.
Thread t1 = new CobaThread1(); Thread t2 = new Thread (new CobaThread2()); t1.start(); t2.start();
Contoh :
for (int ii = 0; ii<8; ii++){
class CobaThread2 implements Runnable {
System.out.println("Thread UTAMA");
public void run()
istirohat(5);
{
}
for(int ii = 0; ii<4; ii++){
}
System.out.println("Ini CobaThread2");
public static void istirohat(int tunda)
Test.istirohat(7); { } try{ } Thread.sleep(tunda*100); public class Test } catch(InterruptedException e) {} { } public static void main (String[] args) } }
Pemrograman Berbasis Objek - 2011
5
Daur Hidup Thread y
newborn 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 ( ); ………
y
Runnable Sebuah thread berada dalam skema penjadwalan akan tetapi dia tidak sedang beraksi. ……… coba.start()
y
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(); ……… } Pemrograman Berbasis Objek - 2011
6
Daur Hidup Thread y
Blocked 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
………………
y
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( ). Pemrograman Berbasis Objek - 2011
7
Daur Hidup Thread
y
y
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.
Pemrograman Berbasis Objek - 2011
8
Daur Hidup Thread
y
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); } }
Pemrograman Berbasis Objek - 2011
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
Pemrograman Berbasis Objek - 2011
10
Daur Hidup Thread y
Thread dengan mengimplementasikan Interface Runnable Bentuk : Thread objek = new Thread(Objekrunnable,<String name>); Objek.start();
atau new Thread(Objekrunnable,<String name>).start(); y
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”); Coba2 t3 = new Coba2(“C”); }
KET : untuk menjalankan thread, lakukan dengan memanggil method start(). Saat start() dijalankan maka sebenarnya mehod run() dari class dijalankan.
} Pemrograman Berbasis Objek - 2011
11
Daur Hidup Thread y
Jenis thread ada dua,yaitu : Daemon merupakan thread yang siklus hidupnya tergantung pada thread utama (main). thread induk berakhir, maka thread daemon juga berakhir.
y
a)
Bila
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) { instantiasi*/
super(nm); /**menjalankan thread dengan sekali
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"); }} Pemrograman Berbasis Objek - 2011
12
Sinkronisasi & Prioritas Thread y
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(