Thread

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Thread as PDF for free.

More details

  • Words: 5,256
  • Pages: 24
[CONTOH BAB BUKU DARI PASCAL KE JAVA]

Thread Multithreading adalah suatu fitur dalam bahasa pemrograman yang memungkinkan kita membuat dua alur atau lebih dalam sebuah program untuk melakukan beberapa hal secara “bersamaan” (sebenarnya tidak seratus persen bersamaan pada mesin dengan satu prosesor, namun sistem memberikan giliran kepada dua proses atau lebih untuk bekerja secara bergantian dengan waktu yang sangat cepat). Program yang paling mudah memberikan contoh dalam hal ini adalah web browser yang memungkinkan kita membaca dokumen sambil mendengarkan musik dan melakukan hal lainnya. Java dan Object Pascal (Delphi) adalah contoh bahasa pemrograman yang memungkinkan kita membuat fitur multithreading dengan cukup mudah. Tujuan kita membuat program dengan kemampuan multithreading adalah: ¾ Menghindari bottleneck (dengan hanya sebuah thread, program harus menghentikan semua operasi ketika sedang menunggu sebuah proses yang lambat, misalnya mengakses file dalam harddisk, berkomunikasi antarjaringan, atau menampilkan fitur multimedia); ¾ Mengatur perilaku program menjadi lebih baik dan efisien (sebuah program dapat diorganisasikan menjadi beberapa proses secara “paralel”, yang prioritasnya bisa diatur sehingga pemanfaatan CPU menjadi lebih efisien); ¾ Multiprocessing. Jika sebuah mesin menggunakan lebih dari satu prosesor dan didukung oleh sistem operasi yang dapat mendukung multi processing, maka penggunaan thread dapat dilakukan oleh masing-masing prosesor sehingga proses yang terjadi benar-benar terjadi secara bersamaan.

Membuat Thread Ada beberapa cara untuk membuat Thread di Java, yaitu: ¾ Membuat sebuah kelas turunan dari Thread dan mengoverride method run; ¾ Mengimplementasikan interface Runnable dan mengimplementasikan method run. Pada Delphi, Thread dapat dibuat dengan membuat sebuah kelas turunan dari TThread dan mengoverride method Execute. Contoh pada Java: 1 2 3 4 5 6 7

package com.wisnuwidiarta.thread; import java.util.Calendar; public class BomWaktu extends Thread { private boolean enabled = false;

Wisnu Widiarta

[C CONTOH BAB B BUKU U DARI PA ASCAL KE E JAVA] 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

public static s void main(S String[] args) a { BomW Waktu bom m = new Bo omWaktu(); ; bom.setEnabled(true); bom.start(); try { System.out.printl ln("Dalam waktu 10 detik, bom b aka an meledak k..."); Thread.sleep(1000 00); } ca atch (InterruptedE Exception e) { } bom.setEnabled(false); Syst tem.out.println("B Bum !!!"); ; } public void v run() { whil le (isEnabled()) { try { Calendar now = Calenda ar.getInstance(); System.out.pr rintln(now w.get(Calendar.HOU UR) + ":" " + now w.get(Calendar.MIN NUTE) + ":" " + now w.get(Calendar.SEC COND)); Thread.sleep( (1000); ptedExcept tion e) { } catch (Interrup } } }

29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 }

private boolean isEnabled d() { retu urn enabled ; } public void v setEnabled (b boolean ac ctive) { this s.enabled d = active e; }

Kode dii atas dapatt ditemukan n pada CD dalam d foldeer Code\Ba ab 13\java\com\wisn nuwidiarta\thread. Keluaran n dari prog gram di atass adalah:

Wisnu Widiarta W

[CONTOH BAB BUKU DARI PASCAL KE JAVA] Dalam waktu 10 detik, bom akan meledak... 8:29:46 8:29:47 8:29:48 8:29:49 8:29:50 8:29:51 8:29:52 8:29:53 8:29:54 8:29:55 Bum !!!

Cara kerja program di atas lebih kurang adalah sebagai berikut: • • • • •

• • •

Pertama-tama program akan menginisialisasi variabel private enabled dengan nilai false (baris ke ke-7) Variabel dengan nama bom yang tipenya BomWaktu dibuat dan diinisialisasi (baris ke-10) Method setEnabled dengan parameter true dipanggil sehingga variabel enabled kini bernilai true Method start merupakan warisan dari kelas Thread. Karena kelas BomWaktu turunan dari kelas Thread, maka method start yang sifatnya public, dapat diakses oleh instance dari kelas BomWaktu Ketika method start sebuah thread dipanggil, jika thread tersebut belum pernah dijalankan, maka thread tersebut akan dijalankan (method run akan dipanggil). Namun jika thread tersebut telah dijalankan dan dipaksa untuk start, maka exception IllegalThreadStateException akan dipicu Program mencetak Dalam waktu 10 detik, bom akan meledak... Lalu tidur selama 10 detik Selanjutnya kontrol program beralih ke dalam method run, dan setiap detiknya memunculkan waktu pada layar Setelah tidur selama 10 detik, program beralih ke baris 20, menghentikan timer dalam method run, dan mencetak ke layar Bum !!!

Program tersebut dapat dijalankan melalui editor NetBeans atau melalui command line dengan perintah: java.exe com.wisnuwidiarta.thread.BomWaktu Pastikan java.exe sudah berada dalam path, atau gunakan path lengkap dengan direktorinya, misalnya D:\java\jdk1.5\bin\java.exe. Pemanggilan pada command line di atas harus diletakkan pada folder di atas folder com. Jika Anda ingin memanggil dari sembarang folder, jangan lupa gunakan parameter –cp (cp berarti classpath) dan sertakan path lengkap hingga ke folder di atas folder com.

Wisnu Widiarta

[CONTOH BAB BUKU DARI PASCAL KE JAVA]

Perhatikan pada gambar di atas, bahwa program java.exe berada pada d:\Wisnu\Misc\Installer\Java\jdk1.5.0\bin, dan folder com/wisnuwidiarta/thread/BomWaktu.class berada pada folder d:\Wisnu\Project\Writing Book\Dari Pascal ke Java\Code\Bab 12\Java, dan pemanggilan kelas BomWaktu dilakukan dari folder c:\. Jika kita bandingkan dengan Delphi, maka programnya lebih kurang sebagai berikut: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

program BomWaktu; {$APPTYPE CONSOLE} {%TogetherDiagram 'ModelSupport_BomWaktu\default.txaPackage'} uses SysUtils, Classes; type TBomWaktu = class(TThread) private FEnabled: boolean; protected procedure Execute; override; public property Enabled: boolean read FEnabled write FEnabled; end; { TBomWaktu } procedure TBomWaktu.Execute; begin while FEnabled do begin writeln(FormatDateTime('HH:MM:SS', Now)); Sleep(1000);

Wisnu Widiarta

[C CONTOH BAB B BUKU U DARI PA ASCAL KE E JAVA] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39

end; end d; var r bom: TBomW Waktu; beg gin bom := TBomWaktu. T Create(tru ue); bom.Enab bled := true; bom.Resu ume; writeln('Dalam waktu 10 det tik, bom akan meleda ak...'); Sleep(10 0000); bom.Enab bled := False; writeln('Bum !!!'); readln; end d.

Kode dii atas dapatt ditemukan n pada CD dalam d foldeer Code\Ba ab 12\pasccal\Bom Wa aktu. Kelas untuk K k mewakili thread di Java adala ah Thread d, sedangka an pada Deelphi adalah TThread. T Method un ntuk dioverride pada a Java adallah run, seedangkan pada p Delphi adalah Execute. Ba agian progrram yang akan dibu uat sebagaii thread, harus h diletakk kan dalam method m terssebut. Ada dua a cara untuk k membuatt thread di Java, J yaitu: • Membuat M keelas turunan n dari Thre ead • Membuat M keelas yang mengimplem m mentasikan interface Runnable R Cara yang lebih C l baik dalam ban nyak kasus adalah carra yang ked dua. Meng gapa? Meskipu un cara yan ng pertama a lebih mu udah untuk k diimplem mentasikan, namun da alam sudut pa andang pem mrograman n berorienttasi objek (OOP), ( cara a kedua leb bih tepat untuk u digunak kan. Pada umumnya u k kita membu utuhkan seebuah threa ad agar seb buah pekerrjaan ‘asal’ bissa dilakuka an dengan thread, t buk kan untuk membuat m seebuah kelass yang mem miliki spesifika asi yang leb bih khususs daripada sebuah Th hread. Misa alnya, kita membuat kelas k PersegiP Panjang dengan d jalan mewarrisi kelas BangunD Datar, kareena kita tahu PersegiP Panjang ad dalah Bang gunDatar dengan sp pesifikasi yang y lebih h khusus. Jika keperlua an kita hanya meelakukan sesuatu dengan d th hread, leb bih baik kita mengim mplementasiikan interfa ace Runnab ble, sehing gga kelas kita k lebih beebas digunakan untuk mewarisi m dari kelas lain n. Ingat, Ja ava hanya memungkin m nkan kita menurunkan n dari satu kelas, namun n dapat mengimplem m mentasikan n banyak interface. i J Jika kita akan unakan inteerface Run nnable, kiita tetap butuh b insta ance dari Thread untuk u menggu menjala ankan kelas kita. M Mari kita perhatikan contoh c mem mbuat Thrread denga an menggun nakan interrface Runnab ble berikut ini. Wisnu Widiarta W

[CONTOH BAB BUKU DARI PASCAL KE JAVA]

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

package com.wisnuwidiarta.thread; import java.util.Calendar; public class BomWaktuDenganRunnable implements Runnable { private boolean enabled = false; public static void main(String[] args) { BomWaktu bomWaktu = new BomWaktu(); bomWaktu.setEnabled(true); Thread bom = new Thread(bomWaktu); bom.start(); try { System.out.println("Dalam waktu 10 detik, bom akan meledak..."); Thread.sleep(10000); } catch (InterruptedException e) { } bomWaktu.setEnabled(false); System.out.println("Bum !!!"); }

public void run() { while (isEnabled()) { try { Calendar now = Calendar.getInstance(); System.out.println(now.get(Calendar.HOUR) + 29 ":" + now.get(Calendar.MINUTE) + 30 ":" + now.get(Calendar.SECOND)); 31 Thread.sleep(1000); 32 } catch (InterruptedException e) { 33 } 34 } 35 } 36

37 38 39 40 41 42 43

private boolean isEnabled() { return enabled ; } public void setEnabled (boolean active) { this.enabled = active;

Wisnu Widiarta

[C CONTOH BAB B BUKU U DARI PA ASCAL KE E JAVA] 44 45 46 }

}

Kode dii atas dapatt ditemukan n pada CD dalam d foldeer Code\Ba ab 13\java\com\wisn nuwidiarta\thread. Perhatik kan pada co ontoh di attas, keluara annya sama a dengan keeluaran BomWaktu.java. Hal yan ng berbeda hanya terlletak pada baris ke-10 0 dan baris ke-12, ba ahwa kita perlu p instancee dari kelas Thread un ntuk menja alankan thrread tersebu ut dengan method m start. Ingat ba ahwa denga an mengim mplementassikan interfface Runna able, sebu uah kelas hanya “menand datangani kontrak” k bahwa ia ak kan mengim mplementassikan meth hod run. Hanya itu saja. Titik. Untu uk membua atnya menjadi sebuah thread, bu uat sebuah variabel v den ngan jenis Th hread (atau u turunann nya), dan pada p constrructornya, berikan b parrameter seb buah instancee dari Runn nable. Ada carra lain untu uk mendap patkan efek k thread, dengan d men nggunakan bantuan inner i class. Keelas utama anya sendirri tidak perrlu mewarissi dari kela as Thread dan tidak pula perlu mengimplem m mentasikan interface Runnable. Namun jelas, innerr classnya yang melakuk kannya. Con ntohnya ad dalah sebaga ai berikut: pac ckage com.wisnuwidiarta.thr read; 1 2 pub blic class s InnerClassThread d { 3 4 public InnerClas I sThread() { 5 ew Thread Thre ead t = n d(new Runn nable() { 6 7 public void v run() { 8 int i=1; 9 while (i <= 3) 3 { 10 System.ou ut.println n(i++); 11 } 12 } 13 14 }); 15 t.st tart(); 16 } 17 18 public static s void main(S String[] args) a { 19 new InnerClassThread( (); 20 } 21 22 23 }

Wisnu Widiarta W

[CONTOH BAB BUKU DARI PASCAL KE JAVA] Jangan bingung dengan contoh di atas. Kelas utama pada contoh di atas adalah InnerClassThread. Di dalam constructor kelas tersebut, ada dua baris statement, yang pertama dimulai dari baris ke-6 hingga baris ke-15, sedangkan statement kedua terletak pada baris ke-16. Baris ke-6 menunjukkan bahwa kita memesan sebuah variabel atau instance dari kelas Thread dengan nama t. Variabel tersebut kita inisialisasi dengan constructor kelas Thread yang membutuhkan sebuah parameter berjenis Runnable. Namun seperti yang kita lihat, kelas utama kita, InnerClassThread, tidak mengimplementasi Runnable. Sehingga kita tidak dapat membuat instance dari kelas InnerClassThread untuk kita passing ke dalam constructor Thread tersebut. Untungnya, Java memiliki fitur kelas anonymous, kelas tanpa nama, yang dapat kita buat seketika tanpa harus kita beri nama. Alih-alih membuat sebuah kelas pembantu kecil yang mengimplementasikan interface Runnable untuk kita jadikan “umpan” ke dalam constructor Thread pada baris ke-6, kita dapat langsung membuat instance tanpa nama dengan perintah : new Runnable() { public void run() { int i=1; while (i <= 3) { System.out.println(i++); } } }

Mengapa ada kurung kurawal setelah Runnable()? Kita tahu bahwa Runnable adalah sebuah interface. Ia tidak memiliki implementasi dari method run( ). Oleh karenanya, kita membuat instance dari kelas Runnable sekaligus mengimplementasikan method run, agar objek yang kita ciptakan menjadi lengkap. Tanpa mengimplementasikan method run, maka Runnable hanyalah sesuatu yang abstrak, tidak kongkrit. Sesuatu yang tidak kongkrit, tidak dapat dibuat instancenya. Ok. Sekarang kita lihat daur hidup sebuah Thread.

Wisnu Widiarta

[CONTOH BAB BUKU DARI PASCAL KE JAVA]

New

Sleep

Runnable

Blocked Running Waiting

Dead Kita mulai dari New. Kondisi ini tercapai ketika thread baru saja dibuat, dan diinstantiasikan. Contohnya adalah: Thread bom = new Thread(bomWaktu); Kita bandingkan dengan proses pembuatan film. Misalkan aktor adalah thread. Aktor memasuki tahapan “new” ketika ia dicasting (dipilih untuk memerankan sebuah peran). Ia belum boleh berakting, hingga sutradara menentukannya. Sutradara dalam dunia thread bisa jadi adalah operating system atau scheduler, yang menentukan kapan sebuah thread dapat giliran untuk beraksi (acting). Setelah sebuah thread dijalankan (dengan memanggil method start), maka ia beralih ke kondisi Runnable. Artinya siap-siap diminta untuk beraksi. Dalam dunia perfilman, berarti sutradara menyuruh sang aktor untuk bersiap-siap di lokasi shooting. bom.start();

Ingat bahwa perintah di atas bukan untuk memulai akting! Tapi untuk bersiapsiap akting, kalau gilirannya sudah siap. Bisa jadi seorang aktor mulai berakting ketika kereta baru saja lewat, atau menunggu giliran aktor lain selesai berakting. Ketika sutradara menentukan untuk berakting, barulah seorang aktor akan mulai berakting. Dalam dunia thread, ketika O/S atau thread scheduler menyuruhnya berjalan, barulah thread itu berjalan. Sebuah thread berjalan ketika ia memasuki method run. Semua script yang harus dilakukan oleh sang thread, eh maksud saya sang aktor, didefinisikan pada method tersebut. Ketika sedang berjalan, sebuah thread bisa keluar dari kondisi running menjadi sleep, blocked, atau waiting akibat dari beberapa hal, yaitu: blocked karena thread menunggu proses I/O untuk selesai; blocked karena thread mencoba memanggil method yang disynchronized, dan lock objecknya belum tersedia;

Wisnu Widiarta

[CONTOH BAB BUKU DARI PASCAL KE JAVA] sleep ketika dalam method run ada perintah untuk sleep (untuk membangunkannya gunakan method interrupt, atau biarkan waktu tidurnya berakhir), contohnya adalah : try { Calendar now = Calendar.getInstance(); System.out.println(now.get(Calendar.HOUR) + ":" + now.get(Calendar.MINUTE) + ":" + now.get(Calendar.SECOND)); Thread.sleep(1000); } catch (InterruptedException e) { }

waiting karena ada pemanggilan method wait (untuk berhenti menunggu, gunakan notify atau notifyAll). Kalau dibandingkan dengan dunia perfilman, bisa dibandingkan ketika sutradara mengatakan “cut” atau ketika akting beralih pada aktor lain. Si aktor harus “menunggu” gilirannya, hingga ia harus berakting kembali. Setelah syuting selesai, maka selesailah tugas aktor tersebut. Dalam dunia thread, sebuah thread menjadi mati (dead atau not alive) ketika semua perintah dalam method run selesai dilakukan dan kontrol telah keluar dari method tersebut.

Sinkronisasi Thread Sebuah thread yang mengakses sebuah objek yang sama, dan keduanya mengubah kondisi atau status dari objek tersebut, maka ada kemungkinan objek tersebut mengalami inkonsistensi data atau menghasilkan program yang tidak diinginkan. Agar program berfungsi dengan normal, ada kalanya kita membutuhkan sinkronisasi thread. Sinkronisasi thread dilakukan dengan menggunakan kata kunci synchronized. Mari kita bayangkan sebuah perpustakaan yang hanya memiliki sebuah buku, dan ada dua peminjam yang akan meminjam buku tersebut. Tanpa disinkronisasi, peminjaman buku tersebut akan menjadi tidak valid, karena ada dua objek berbeda yang mencoba mengakses satu-satunya resource, yaitu buku. Dalam kejadian sesungguhnya, bisa saja ada dua aplikasi yang berebut mengakses printer, misalnya. 1 2 3 4 5 6 7 8 9

package com.wisnuwidiarta.thread; public class Perpustakaan { static Buku satuSatunyaBuku = new Buku("Dari Pascal ke Java"); public static void main(String[] args) { Peminjam deNiro = new Peminjam("De Niro"); Peminjam alPacino = new Peminjam("Al Pacino");

Wisnu Widiarta

[CONTOH BAB BUKU DARI PASCAL KE JAVA] 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56

deNiro.pinjam(satuSatunyaBuku); alPacino.pinjam(satuSatunyaBuku); Thread deNiroThread = new Thread(deNiro); Thread alPacinoThread = new Thread(alPacino); deNiroThread.setName(deNiro.getNamaPeminjam()); alPacinoThread.setName(alPacino.getNamaPeminjam()); deNiroThread.start(); alPacinoThread.start(); } } class Buku { private String judulBuku; private boolean sedangDipinjam = false; private Peminjam peminjamBuku; public Buku(String judul) { judulBuku = judul; } public void dipinjam(Peminjam peminjam) { sedangDipinjam = true; peminjamBuku = peminjam; System.out.println("Buku " + judulBuku + " sekarang sedang dipinjam oleh " + peminjam.getNamaPeminjam() +"."); } public void dikembalikan() { sedangDipinjam = false; System.out.println("Buku " + judulBuku + " telah dikembalikan."); peminjamBuku = null; } public boolean isDipinjam() { return sedangDipinjam; } public String getJudulBuku() { return judulBuku; }

Wisnu Widiarta

[CONTOH BAB BUKU DARI PASCAL KE JAVA] 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92

public Peminjam getPeminjamBuku() { return peminjamBuku; } } class Peminjam implements Runnable { private Buku buku; private String namaPeminjam; public Peminjam (String nama) { namaPeminjam = nama; } public void pinjam (Buku bukuDipinjam) { buku = bukuDipinjam; } public void run() { System.out.println("Thread " + Thread.currentThread().getName() + " sedang beraksi..."); if (buku.isDipinjam() == false) { System.out.println(" Karena buku " + buku.getJudulBuku() + " tidak sedang dipinjam, maka " + namaPeminjam + " berniat untuk meminjamnya."); try { System.out.println(" " + namaPeminjam + " menuju ke rak buku..."); Thread.sleep(10); } catch (InterruptedException e) { } buku.dipinjam(this); } else { System.out.println(" " + namaPeminjam + " tidak bisa meminjam buku " + buku.getJudulBuku() + " karena sedang dipinjam

93 oleh " + buku.getPeminjamBuku().getNamaPeminjam() +"."); 94 } 95 } 96 97 public Buku getBuku() { 98 return buku; 99 } 100 101 Wisnu Widiarta

[C CONTOH BAB B BUKU U DARI PA ASCAL KE E JAVA] 102 103 104 105 106 }

public String getNamaPem minjam() { ret turn namaPeminjam; }

Kode dii atas dapatt ditemukan n pada CD dalam d foldeer Code\Ba ab 13\java\com\wisn nuwidiarta\thread. Jika dija alankan, sallah satu kem mungkinan n dari jalann nya program m adalah seebagai berikut: Thread De Niro sedang be eraksi... Kare ena buku Dari Pasc cal ke Jav va tidak berniat t untuk meminjamny ya. De Niro N menuju ke rak k buku... Thread Al Pacino sedang beraksi.. .. Kare ena buku Dari Pasc cal ke Jav va tidak Pacino berniat untuk mem minjamnya. . Al Pacino P menuju ke rak r buku.. .. Buku Da ari Pascal ke Java a sekarang g sedang Buku Da ari Pascal ke Java a sekarang g sedang

sedang di ipinjam, maka m De Niro

sedang di ipinjam, maka m Al

dipinjam oleh De Niro. N dipinjam oleh Al Pacino. P

Mengapa salah M s satu kemungk kinan? Karrena tingk kah laku thread sa angat ditentuk kan dari sch hedulernya a. Dan beda a JVM, run ntime, dan O/S O dapat mempenga aruhi jalannya a sebuah thread. K lihat pa Kita ada program m di atas, sa atu-satunya a buku dipiinjam oleh dua orang yang berbeda a, persis ketika k De Niro men nuju ke rak buku, Al Pacino o juga berniat meminja amnya. Ak khirnya karrena kedua anya mera asa yakin buku b itu tidak t ada yang meminja am, maka masing-ma m sing menda apat buku tersebut. t Seekarang kitta lihat hasiilnya setelah kita k mensin nkronisasik kan objek bu uku. Artinyya ketika bu uku sedang dipinjam, yang lain tida ak bisa mem minjamnya. Perhatikan n method run r yang dip perbaiki beerikut ini:

pu ublic void run() { System.out.print tln("Threa ad " + Thread.currentTh hread().ge etName() + " sedan ng beraksi i..."); synchron nized (bu uku) { if (buku.isD Dipinjam() ) == false e) { System.o out.printl ln(" Karena buku u " + buku.ge etJudulBuku() + " tidak sedang di ipinjam, maka m " + namaPemin njam + " bernia ya."); at untuk meminjamn m try {

Wisnu Widiarta W

[CONTOH BAB BUKU DARI PASCAL KE JAVA] System.out.println(" " + namaPeminjam + " menuju ke rak buku..."); Thread.sleep(10); } catch (InterruptedException e) { } buku.dipinjam(this); } else { System.out.println(" " + namaPeminjam + " tidak bisa meminjam buku " + buku.getJudulBuku() + " karena sedang dipinjam oleh " + buku.getPeminjamBuku().getNamaPeminjam() +"."); } } }

Keluaran dari program dengan sinkronisasi di atas adalah: Thread De Niro sedang beraksi... Karena buku Dari Pascal ke Java tidak sedang dipinjam, maka De Niro berniat untuk meminjamnya. De Niro menuju ke rak buku... Thread Al Pacino sedang beraksi... Buku Dari Pascal ke Java sekarang sedang dipinjam oleh De Niro. Al Pacino tidak bisa meminjam buku Dari Pascal ke Java karena sedang dipinjam oleh De Niro.

Sekarang kita bandingkan dengan program yang mirip program di atas dengan Delphi: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

program Perpustakaan; {$APPTYPE CONSOLE} {%TogetherDiagram 'ModelSupport_Perpustakaan\default.txaPackage'} uses SysUtils, Classes; type TBuku = class; //forward declaration, agar TBuku dapat digunakan pada kelas TPeminjam TPeminjam = class(TThread) private FBuku: TBuku; FNamaPeminjam: String; public

Wisnu Widiarta

[CONTOH BAB BUKU DARI PASCAL KE JAVA] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

constructor Create(nama: String; CreateSuspended: Boolean); reintroduce; procedure Pinjam(bukuDipinjam: TBuku); procedure Execute; override; function GetBuku: TBuku; function GetNamaPeminjam: String; end; //style di atas adalah bentuk yang paling umum digunakan di Delphi TBuku = class private FJudulBuku: String; private FSedangDipinjam: boolean; private FPeminjamBuku: TPeminjam; public constructor Create(judul: String); public procedure Dipinjam(peminjam: TPeminjam); public procedure Dikembalikan; public function IsDipinjam: boolean; public function GetJudulBuku: String; public function GetPeminjamBuku: TPeminjam; end; {style di atas tidak umum digunakan di Delphi, namun mungkin terasa familiar bagi programmer java yang sedang membuat aplikasi di Delphi} { TBuku } constructor TBuku.Create(judul: String); begin FJudulBuku := judul; end; procedure TBuku.dikembalikan; begin FSedangDipinjam := False; writeln('Buku ' + FJudulBuku + ' telah dikembalikan.'); FPeminjamBuku := Nil; end; procedure TBuku.dipinjam(peminjam: TPeminjam); begin FSedangDipinjam := True; FPeminjamBuku := peminjam; writeln('Buku ' + FJudulBuku + ' sekarang sedang dipinjam oleh ' + FPeminjamBuku.GetNamaPeminjam + '.');

Wisnu Widiarta

[CONTOH BAB BUKU DARI PASCAL KE JAVA] 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110

end; function TBuku.getJudulBuku: String; begin Result := FJudulBuku; end; function TBuku.getPeminjamBuku: TPeminjam; begin Result := FPeminjamBuku; end; function TBuku.isDipinjam: boolean; begin Result := FSedangDipinjam; end; { TPeminjam } constructor TPeminjam.Create(nama: Boolean); begin inherited Create(CreateSuspended); FNamaPeminjam := nama; end;

String;

CreateSuspended:

procedure TPeminjam.Execute; begin if (FBuku.isDipinjam() = False) then begin writeln(' Karena buku ' + FBuku.getJudulBuku + ' tidak sedang dipinjam, maka ' + FNamaPeminjam + ' berniat untuk meminjamnya.'); writeln(' ' + FNamaPeminjam + ' menuju ke rak buku...'); sleep(10); FBuku.dipinjam(Self); end else begin writeln(' ' + FNamaPeminjam + ' tidak bisa meminjam buku ' + FBuku.getJudulBuku + ' karena sedang dipinjam oleh ' + FBuku.getPeminjamBuku.getNamaPeminjam + '.'); end; end;

Wisnu Widiarta

[C CONTOH BAB B BUKU U DARI PA ASCAL KE E JAVA] 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144

fu unction TPe eminjam.GetBuku: TBu uku; begin Result := FBuku; en nd; fu unction TPe eminjam.GetNamaPemin njam: Strin ng; begin Result := FNamaPeminjam; en nd; pr rocedure TP Peminjam.Pinjam(buku uDipinjam: TBuku); begin FBuku := : bukuDipinjam; en nd; va ar satuSatun nyaBuku: TBuku; deNiro, alPacino: a TPeminjam; ; begin deNiro := TPeminjam.Create e('De Niro', True); .FreeOnTerminate := True; deNiro. alPacin no := TPeminjam.Crea ate('Al Pacino', Tru ue); alPacin no.FreeOnTerminate := : True; satuSat tunyaBuku := TBuku.C Create('Dari Pascal Ke Java'); deNiro. .Pinjam(satuSatunyaB Buku); alPacin no.Pinjam(satuSatuny yaBuku); deNiro. .Resume; alPacin no.Resume; readln; ; en nd.

Kode dii atas dapatt ditemukan n pada CD dalam d foldeer Code\Ba ab 13\ pascal\P Perpustaka aan\Tanpa Synchronizzed. a adalah seb bagai berik kut: Hasilnya Kare ena buku Dari Pasc cal Ke Jav va tidak sedang di ipinjam, m maka De Niro berniat t untuk meminjamny ya. De Niro N menuju ke rak k buku... Kare ena buku Dari Pasc cal Ke Jav va tidak sedang di ipinjam, maka m Al Pacino berniat untuk mem minjamnya. . ` Al Pacino menuju ke rak buku. ...

Wisnu Widiarta W

[CONTOH BAB BUKU DARI PASCAL KE JAVA] Buku Dari Pascal Ke Java sekarang sedang dipinjam oleh De Niro. Buku Dari Pascal Ke Java sekarang sedang dipinjam oleh Al Pacino.

Sayangnya, method synchronize milik TThread menggunakan message loop, sehingga tidak dapat digunakan pada aplikasi console. Namun demikian, untuk melakukan sinkronisasi, Delphi memiliki beberapa cara, salah satunya adalah dengan menggunakan critical section (selain dengan Mutex dan Semaphore). Modifikasi program di atas seperti pada penggalan program berikut: var criticalSection: TCriticalSection; procedure TPeminjam.pinjamBuku; begin criticalSection.Acquire; if (FBuku.isDipinjam = False) then begin writeln(' Karena buku ' + FBuku.getJudulBuku + ' tidak sedang dipinjam, maka ' + FNamaPeminjam + ' berniat untuk meminjamnya.'); writeln(' ' + FNamaPeminjam + ' menuju ke rak buku...'); sleep(10); FBuku.dipinjam(Self); end else begin writeln(' ' + FNamaPeminjam +' tidak bisa meminjam buku ' + FBuku.getJudulBuku + ' karena sedang dipinjam oleh ' + FBuku.getPeminjamBuku.getNamaPeminjam + '.'); end; criticalSection.Release; end; var satuSatunyaBuku: TBuku; deNiro, alPacino: TPeminjam; begin deNiro := TPeminjam.Create('De Niro', True); deNiro.FreeOnTerminate := True; alPacino := TPeminjam.Create('Al Pacino', True); alPacino.FreeOnTerminate := True; satuSatunyaBuku := TBuku.Create('Dari Pascal Ke Java'); deNiro.Pinjam(satuSatunyaBuku); alPacino.Pinjam(satuSatunyaBuku); criticalSection := TCriticalSection.Create; deNiro.Resume; alPacino.Resume; readln; criticalSection.Free; end.

Wisnu Widiarta

[CONTOH BAB BUKU DARI PASCAL KE JAVA] Hasilnya adalah sebagai berikut: Karena buku Dari Pascal Ke Java tidak sedang dipinjam, maka De Niro berniat untuk meminjamnya. De Niro menuju ke rak buku... Buku Dari Pascal Ke Java sekarang sedang dipinjam oleh De Niro. Al Pacino tidak bisa meminjam buku Dari Pascal Ke Java karena sedang dipinjam oleh De Niro.

Mari kita lihat contoh lain, berupa penggunaan method sleep dan interrupt untuk thread di Java. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

package com.wisnuwidiarta.thread; public class SleepingBeauty implements Runnable { private String name; public SleepingBeauty(String name) { this.name = name; } public static void main(String[] args) { SleepingBeauty aLovelyPrincess = new SleepingBeauty("Hot Princess"); Thread sleeper = new Thread(aLovelyPrincess); PrinceCharming aCoolAndHandsomePrince = new PrinceCharming(sleeper); Thread waker = new Thread(aCoolAndHandsomePrince); sleeper.start(); waker.start(); }

public void run() { boolean sleepForever = true; while (sleepForever) { try { System.out.println(name + " is still 24 sleeping..."); Thread.sleep(1000); 25 } catch (InterruptedException e) { 26 sleepForever = false; 27 System.out.println("The princess is awake..."); 28 } 29 } 30 } 31

32 33 } Wisnu Widiarta

[C CONTOH BAB B BUKU U DARI PA ASCAL KE E JAVA] 34 ass Prince eCharming implemen nts Runnab ble { 35 cla 36 private Thread princessTh hread; 37 38 public PrinceCha P rming(Thr read sleep per) { 39 prin ncessThre ad = slee eper; 40 } 41 42 public void v run() { 43 try { 44 System.out.printl ln("The pr rince is running.. .."); 45 Thread.sleep(5000 0); 46 System.out.printl ln("The pr rince is trying to o wake e princess s..."); 47 the princessThread.in nterrupt() ); 48 } ca atch (InterruptedE Exception e) { 49 ut.printl ln("Failed d..."); System.o 50 } 51 } 52 53 54 }

Kode dii atas dapatt ditemukan n pada CD dalam d foldeer Code\Ba ab 13\java\com\wisn nuwidiarta\thread. Keluaran n dari prog gram di atass adalah: Hot The Hot Hot Hot Hot The Hot The

Pri incess is still sl leeping... . pri ince is running... Pri incess is still sl leeping... . Pri incess is still sl leeping... . Pri incess is still sl leeping... . Pri incess is still sl leeping... . pri ince is trying to wake the princess... Pri incess is still sl leeping... . pri incess is awake...

Terkada ang, keluara annya adala ah: Hot The Hot Hot Hot Hot The

Pri incess is still sl leeping... . pri ince is running ... Pri incess is still sl leeping... . Pri incess is still sl leeping... . Pri incess is still sl leeping... . Pri incess is still sl leeping... . pri ince is trying to wake the princess...

Wisnu Widiarta W

[CONTOH BAB BUKU DARI PASCAL KE JAVA] The princess is awake...

Prioritas Thread Thread dapat diberi prioritas tertentu, sesuai dengan keperluan. Tanpa penggunaan prioritas, giliran untuk berjalan sebuah thread tergantung sepenuhnya pada scheduling yang ada pada JVM dan mesin yang kita miliki. Mari kita lihat contoh berikut: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

package com.wisnuwidiarta.thread; public class ThreadTanpaPrioritas { public static void main(String[] args) { new Thread1().start(); new Thread2().start(); } } class Thread1 extends Thread { public void run() { while (true) { System.out.println("1"); } } } class Thread2 extends Thread { public void run() { while (true) { System.out.println("2"); } } }

Keluaran program di atas, salah satunya adalah menampilkan angka 1 sebanyak 160 kali, lalu angka 2 dan angka 1 berselang-seling sebentar, lalu 2 sebanyak 120 kali dan seterusnya. Jika masing-masing thread kita berikan prioritas yang berbeda, maka hasilnya jadi berbeda. 1 2

package com.wisnuwidiarta.thread;

Wisnu Widiarta

[CONTOH BAB BUKU DARI PASCAL KE JAVA] 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

public class ThreadDenganPrioritas { public static void main(String[] args) { new Thread1().start(); new Thread2().start(); } } class Thread1 extends Thread { public void run() { setPriority(Thread.NORM_PRIORITY); while (true) { System.out.println("1"); } } } class Thread2 extends Thread { public void run() { setPriority(Thread.NORM_PRIORITY + 1); while (true) { System.out.println("2"); } } }

Pada program di atas, angka 2 akan muncul jauh lebih sering daripada angka 1, karena prioritas Thread1 lebih tinggi daripada prioritas Thread2. Jangan terlalu bergantung pada prioritas thread untuk menentukan kebenaran program, karena tingkah laku pengaturan prioritas ini tidak dijamin. Penggunaan prioritas lebih diutamakan untuk mengatur efisiensi program, bukan kebenarannya.

Wait dan Notify Mari kita lihat penggunaan wait dan notify yang akan diterapkan pada contoh sleeping beauty di atas berikut ini. 1 2 3

package com.wisnuwidiarta.thread; public class SleepingBeautyWithWaitAndNotify implements Runnable {

Wisnu Widiarta

[CONTOH BAB BUKU DARI PASCAL KE JAVA] 4 5 6 7 8 9 10 11 12 13 14

private String name; public SleepingBeautyWithWaitAndNotify(String name) { this.name = name; } public static void main(String[] args) { SleepingBeautyWithWaitAndNotify aLovelyPrincess = new SleepingBeautyWithWaitAndNotify("Hot Princess"); Thread waiter = new Thread(aLovelyPrincess); PrinceCharming aCoolAndHandsomePrince = new PrinceCharming(waiter); Thread waker = new Thread(aCoolAndHandsomePrince);

15 16 17 waiter.start(); 18 waker.start(); 19 } 20 21 public synchronized void run() { 22 System.out.println(name + " is still sleeping..."); 23 try { 24 wait(); 25 } catch (InterruptedException e) { 26 System.out.println("The princess is awake..."); 27 } 28 } 29 30 public synchronized void kissSoftly() { 31 notify(); 32 } 33 34 35 } 36 37 class PrinceCharmingWithNotify implements Runnable { 38 private SleepingBeautyWithWaitAndNotify princessThread; 39 40 41 42 43 44 45 46 47

public PrinceCharmingWithNotify(SleepingBeautyWithWaitAndNotify waiter) { princessThread = waiter; } public void run() { System.out.println("The prince is running ..."); try {

Wisnu Widiarta

[C CONTOH BAB B BUKU U DARI PA ASCAL KE E JAVA] 48 49 50 51 52 53 54 55 }

Thread.sleep(5000 0); princessThread.ki issSoftly(); } ca atch (InterruptedE Exception e) { System.out.printl ln("Failed d..."); } }

Kode dii atas dapatt ditemukan n pada CD dalam d foldeer Code\Ba ab 13\java\com\wisn nuwidiarta\thread. Keluaran n pada prog gram di ata as adalah: Hot The The The

Pri incess is still sl leeping... . pri ince is running ... pri ince is trying to wake the princess... pri incess is awake...

Perhatik kan bahwa untuk u dapa at menggun nakan wait t, kita haruss mendapattkan lock ob bject tersebutt terlebih da ahulu. Untu uk itulah kiita menggu unakan syn nchronize ed pada meethod run pad da contoh tersebut. Tanpa meelakukannyya, sebuah exception akan mun ncul, seperti berikut b ini: Excepti ion in thread "Thr read-0" ja ava.lang.IllegalMo onitorStat teException: current t thread not owner r at java.la ang.Object t.wait(Native Meth hod) at java.la ang.Object t.wait(Object.java a:474) at com.wis snuwidiarta.thread d.Sleeping gBeautyWithWaitAnd dNotify.ru un(SleepingB eautyWi ithWaitAndNotify.java:24) at java.la ang.Thread d.run(Thread.java: :595)

Wisnu Widiarta W

Related Documents

Thread
November 2019 32
Thread
November 2019 31
Thread
June 2020 20
Thread
November 2019 25
Show Thread
June 2020 4
Kernel Thread
November 2019 26