Thread
16th week Estu Sinduningrum ST,MT
Multitasking dan Multithreading
Multitasking Multitasking adalah suatu istilah yang menjelaskan bahwa sebuah
komputer dapat menjalankan bebeiapa aktiviias (yang sama maupun berbeda) secara simultan/bersamaan. Multitasking itu sendiri dibedakan menjadi dua macam, yaitu sebagai
berikut: Process-based multitasking.
Thread-based multitasking
Estu Sinduningrum, ST, MT
Estu Sinduningrum, ST, MT
Multitasking
Istilah process-based multitasking digunakan untuk menyatakan
aktivitas-aktivitas yang dikerjakan secara bersama-sama dan aktivitas tersebut berbasis pada sebuah proses (dalam hal ini, program atau aplikasi). Ini artinya, pada saat yang bersamaan, kita dapat menjalankan lebih dari
satu program atau aplikasi dalam satu komputer. Sebagai contoh, ketika kita sedang menjalankan sebuah aplikasi pengolah
kala (word processor), kita juga dapat menjalankan aplikasi lainnya, misalnya: aplikasi yang digunakan untuk memainkan: musik/lagu.
Estu Sinduningrum, ST, MT
thread-based multitasking Adapun istilah thread-based multitasking digunakan untuk
aktivitas-aktivitas yang berbasis pada thread. Hal ini berararti dalam satu program atau aplikasi tertentu, kita dapat menjalankan lebih dari satu thread secara bersamaan. Sebagai contoh, asumsikan kita sedang menggunakan aplikasi word processor. Pada saat yang bersamaan kita dapat melakukan formatting teks dan sekaligus melakukan proses pencetakan dokumen. Hal ini, bisa terjadi karena pekerjaan/ormatting teks dan proses pencetakan disimpan di dalam thread yang terpisah.
Estu Sinduningrum, ST, MT
thread-based multitasking Process-based multitasking membutuhkan ruang memori yang
berbeda untuk mengeksekusi setiap aktivitas (dalam hal ini). proses yang ada. Setiap program atau aplikasi akan berjalan secara independen satu sama lain. Data dan elemen-elemen program lainnya pun akan tersimpan pada masing-masing stack yang terpisah untuk setiap program.
Estu Sinduningrum, ST, MT
thread-based multitasking
Adapun pada thread-based multitasking, satu ruang memori
digunakan secara bersama-sama oleh setiap thread yang ada. Gambar di bawah ini akan mengilustrasikan konsep thread-based multitasking di dalam Java.
Estu Sinduningrum, ST, MT
Catatan bagi Anda: dalam referensi lain ada juga yang menyebutkan bahwa istilah multita.sking hanya digunakan untuk menyatakan process-based multitasking, sedangkan thread-based multitasking dinyatakan dalam istilah lain, yaitu multithreading.
Estu Sinduningrum, ST, MT
Apa ltu Thread? Thread adalah suatu bagian program (berupa runtunan kode) yang
tidak tergantung pada bagian lain dan dapat dijalankan secara simultan. Ini artinya, suatu threod dapat diistirahatkan (paused) tanpa harus menghentikan bagian lain atau keseluruhan program. Hal ini disebabkan setiap thread mendefinisikan sebuah lokasi eksekusi yang berbeda. Sebuah program yang ditulis dengan menggunakan Java dapat memiliki lebih dari satu thread. Dan, seperti yang telah disinggung sebelumnya, pada saat runtime, semua threadyang ada di dalam program akan menempati ruang memori yang sama sehingga thread-thread tersebut dapat berbagi data dan kode satu sama lain.
Estu Sinduningrum, ST, MT
Apa ltu Thread? Meskipun thread utama (main thread) dibuat secara otomatis pada
saat program dijalankan, akan tetapi kita dapat mengontrolnya melalui objek dari kelas thread. Adapun thread-thread lain yang ada biasanya disebut dengan thread anak (child thread). Untuk melakukan hal ini, kita harus memanggil method currentThread() yang didefinisikan pada kelas Thread. Adapun bentuk umum deklarasinya sebagai berikut:
Latihan 99
class DemoThreadUtama { public static void main(String[] args) throws InterruptedException { // mendapatkan thread yang sedang aktif Thread tUtama = Thread.currentThread(); // menampilkan informasi tentang thread System.out.print("Informasi awal: "); System.out.println(tUtama.toString()); // mengganti nama thread tUtama.setName("Thread utama"); // menampilkan kembali informasi tentang thread System.out.print("Informasi setelah diubah namanya: "); System.out.println(tUtama.toString()); for (int i=0; i<5; i++) { System.out.println("Detik ke-" + (i+1)); Thread.sleep(1000); // membuat delay selama 1 detik ST, MT }Estu} Sinduningrum, }
Estu Sinduningrum, ST, MT
Membuat dan Menjalankan Thread Java mendefinisikan dua cara untuk membuat sebuah thread, yaitu:
Dengan membuat kelas baru yang mengimplementasikan interface Runnable atau dengan membuat kelas baru yang merupakan turunan dari kelas Thread.
Baik kelas Thread maupun interface Runnable, keduanya tersimpan dalam paket java. Tang. Kita tahu bahwa paket java.lang secara otomatis akan diimpor ke dalam setiap program Java yang kita tulis sehingga kelas dan interface tersebut akan langsung dikenali oleh program
Estu Sinduningrum, ST, MT
Cara I: Mengimplementasikan Interface Runnable
Interfoce Runnable mendefinisikan sebuah method, yaitu run() ;
yang harus diimplementasi oleh kelas-kelas yang mengimplementasikan interface tersebut. Method run() digunakan untuk mengisi kode yang akan dilakukan pada saatthread dijalankan. Thread akan dihentikan pada saat program selesai mengeksekusi method run (). Berikut ini deklarasi interface Runnable. public interface Runnable { public void run(); }
Estu Sinduningrum, ST, MT
Cara I: Mengimplementasikan Interface Runnable
Di dalam method run() inilah kita mengisikan kode untuk proses
yang akan dijalankan oleh thread bersangkutan. Sama seperti method Lain, dalam method run g kita juga untuk memanggil method lain, mendeklarasikan kelas lain maupun variabel-variabel yang bersifat lokal. Setelah kita membuat kelas yang mengimplementasikan interface Runnable dan membuat objek atau instance dari kelas tersebut, maka objek itu sudah daftar digunakan untuk membentuk thread. Caranya adalah dengan melewatkannya ke dalam constructor kelas thread, yang memiliki bentuk umum seperti berikut: Thread (Runnable objThread) Thread(Runnable objThread, String namaThread)
Estu Sinduningrum, ST, MT
Cara I: Mengimplementasikan Interface Runnable
objThread. adalah objek dari kelas yang mengimplementasikan interface Runnable. Dengan kata lain, objThread adalah objek pemilik
method run () ; yang kodenya akan dieksekusi pada saat thread dijalankan. Apabila kita ingin memberi nama default untuk thread yang akan dibuat,
maka kita juga dapat menyertakan nama ke dalam parameter namaThread. Nama yang ditentukan pada saat pembuatan thread ini dapat kita ubah
dengan menggunakan method setName () maupun dipanggil namanya dengan menggunakan method getName() .
Estu Sinduningrum, ST, MT
Cara I: Mengimplementasikan Interface Runnable
Objek thread yang terbuat tidak secara otomatis dijalankan. Agar thread tersebut dijalankan, kita harus memanggil method
start() ( dari objek thread tersebut. Sebenarnya, method start() secara otomatis akan memanggil run() yang terdapat pada kelas yang mengimplementasikan interface Runnable. Dengan demikian, kita tidak pernah memanggil method run() secara langsung. Adapun bentuk umum deklarasi dari method start() yang didefinisikan pada kelas thread sebagai berikut: void start()
Latihan 100
class MyRunnable implements Runnable { // mengimplementasikan method run() yang dideklarasikan // di dalam interface Runnable public void run() { System.out.println("Thread anak dieksekusi"); } } class DemoImplementRunnable1 { public static void main(String[] args) { // (LANGKAH KE-1) // membuat objek Runnable MyRunnable obj = new MyRunnable(); // (LANGKAH KE-2) // membuat objek Thread dengan melewatkan objek Runnable Thread t = new Thread(obj); // (LANGKAH KE-3) // menjalankan thread t.start(); System.out.println("Thread utama dieksekusi"); } Estu } Sinduningrum, ST, MT
Pada latihan 100 , mula-mula kita membuat objek dari kelas
MyRunnable, yaitu kelas yang telah mengimplementasikan interface Runnable. Selanjutnya, objek dari kelas tersebut digunakan untuk membentuk sebuah thread
baru dengan cara melewatkannya ke dalam constructor kelas threaa, setelah thread terbentuk, kemudian kita menjalankan thread tersebut. Ini artinya, kita perlu menuliskan tiga buah langkah untuk membentuk sebuah
threai baru dan untuk menjalankannya. Bentuk ini sebenarnya dapat disingkat dengan membungkus ketiga buah langkah
tersebut ke dalam constructor kelas MyRunnable. Dengan demikian, pada saat kita membuat objek dari kelas MyRunnable, maka
secara otomatis thread juga telah terbuat dan akan langsung dijalankan Estu Sinduningrum, ST, MT
Latihan 101
class MyRunnable implements Runnable { private Thread t; // constructor kelas MyRunnable MyRunnable() { t = new Thread(this); // melewatkan objek MyRunnable t.start(); // menjalankan thread } public void run() { System.out.println("Thread baru dieksekusi"); } } class DemoImplementRunnable2 { public static void main(String[] args) { // HANYA SATU LANGKAH MyRunnable obj = new MyRunnable(); System.out.println("Thread utama dieksekusi"); } Estu } Sinduningrum, ST, MT
Cara ll: Menurunkan Kelas Thread Cara lain yang dapat digunakan untuk membuat thread di dalam Java
adalah dengan membuat kelas baru yang merupakan turunan dari kelas thread. Selanjutnya, kita harus membuat objek atau instance dari kelas baru tersebut. Sama seperti yang terdapat pada cara sebelumnya, disini, objek thread juga dijalankan melalui pemanggilan method start(). Maka dari itu, kelas baru yang mempakan turunan dari kelas thread harus melakukan ouerride terhadap method run() yang didefinisikan pada kelas thread. Estu Sinduningrum, ST, MT
Cara ll: Menurunkan Kelas Thread Apabila dikaji secara lebih mendalam, sebenarnya kelas thread itu
sendiri juga merupakan suatu kelas yang mengimplementasikan interface Runnable, sehingga kelas tersebut memiliki method run(). Namun, di dalam kelas thread, method run() yang didefinisikan tidak memiliki kode implementasi (tidak melakukan apa-apa). Dengan demikian, kelas turunan dari kelas thread yang harus mengimplementasikan method tersebut. Berikut ini contoh program yang akan menunjukkan bagaimana cara membentuk sebuah thread dengan membuat kelas turunan dari kelas rhread.
Estu Sinduningrum, ST, MT
Latihan 102
// membuat kelas turunan dari kelas Thread class MyThread extends Thread { // melakukan override terhadap method run() public void run() { System.out.println("Thread baru dieksekusi"); } }
class DemoExtendsThread { public static void main(String[] args) { MyThread t = new MyThread(); t.start(); System.out.println("Thread utama dieksekusi"); } } Estu Sinduningrum, ST, MT
Estu Sinduningrum, ST, MT
Cara Mana yang Lebih Direkomendasikan?
Dari kedua cara yang telah kita pelajari di atas, mungkin Anda
bingung dan bertanya: "Cara mana yang lebih direkomendasikan untuk membuat sebuah thread di dalam Java?". Jawabnya sebenarnya terserah kepada Anda sendiri. Namun, pada kenyataan di lapangan, kebanyakan programmer Java
menggunakan cara yang pertama (Cara I), yaitu dengan
mengimplementasikan interface Runnable. Berikut ini alasannya:
Estu Sinduningrum, ST, MT
Cara Mana yang Lebih Direkomendasikan?
Kelas baru yang diperankan sebagai thread mungkin hanya perlu
bersifat runnable (hanya dapat dijalankan secara simultan), tidak membutuhkan semua method turunan dari kelas Thread. Oleh karena itu, apabila kita memilih Cara II, maka hal ini akan
menjadi sesuatu yang berlebihan atau boros. Apabila ditinjau dari sisi desain, kelas baru yang diturunkan dari kelas
Thread mungkin tidak dapat diturunkan lagi menjadi kelas turunan (subclass) lainnya. Hal ini disebabkan karena kelas tersebut sudah "terpatok" pada sifat-sifat dari kelas Thread.
Menghentikan Thread Thread yang telah dijalankan secara otomatis akan dihentikan
ketika semua proses (dalam hal ini kode yang terdapat dalam method run() telah selesai dieksekusi. Meskipun demikian, kita diizinkan untuk menghentikan thread
secara manual. Kelas thread sebenarnya mendefinisikan method stop() untuk
mengatasi keperluan ini. Namun,
method ini sudah bersifat deprecated (tidak direkomendasikan lagi untuk digunakan).
Estu Sinduningrum, ST, MT
Menghentikan Thread Sebagai gantinya, gunakan variabel bertipe boolean untuk
mengontrol pengulangan yang terdapat di dalam method run(). Berikut ini contoh program yang akan menunjukkan hal tersebut.
Estu Sinduningrum, ST, MT
Latihan 103
class MyThread extends Thread { // mendeklarasikan variabel boolean untuk mengontrol pengulangan private boolean selesai = false; public void run() { int counter = 0; System.out.println("Thread anak dijalankan"); while (!selesai) { System.out.print((++counter) + " "); } System.out.println("Thread anak selesai"); } public void stopThread() { selesai = true; } } class DemoStopThread { public static void main(String[] args) throws InterruptedException { System.out.println("Thread utama dijalankan"); MyThread t = new MyThread(); // menjalankan thread anak t.start(); // mengistirahatkan thread utama selama 1/40 detik Thread.sleep(25); // menghentikan thread anak t.stopThread(); // JANGAN GUNAKAN: t.stop(); Estu Sinduningrum, ST, MT System.out.println("\nThread utama selesai"); } }
Multiple Thread Sejauh ini, jumlah thread maksimal yang kita gunakan dalam
program hanya dua, yaitu yang terdiri dari satu thread utama dan satu thread anak. Namun, sesuai dengan namanya – multithreaded programming, kita
diizinkan untuk memiliki lebih dari dua thread anak yang dapat dijalankan secara simultan dalam satu program yang kita buat. Bagian ini akan menunjukkan cara pembuatan beberapa buah thread
anak dan cara menjalankan thread-thread tersebut. Estu Sinduningrum, ST, MT
Latihan 104
class MyThread1 extends Thread { public void run() { try { for (int i=0; i<10; i++) { System.out.println("Thread pertama: detik ke-" + (i+1)); if (i != 9) { sleep(1000); } else { System.out.println("Thread pertama selesai...\n"); } } } catch (InterruptedException ie) { System.out.println(ie.getMessage()); } } }
if (i != 4) { System.out.println(); sleep(1000); } else { System.out.println("Thread kedua selesai...\n"); } } } catch (InterruptedException ie) { System.out.println(ie.getMessage()); } } }
class MyThread2 extends Thread { public void run() { try { for (int i=0; i<5; i++) { System.out.println("Thread kedua: detik keSinduningrum, ST, MT " +Estu (i+1));
MyThread1 t1 = new MyThread1(); t1.start();
class DemoMultipleThread { public static void main(String[] args) {
MyThread2 t2 = new MyThread2(); t2.start(); } }
Mengenal Method is Alive() dan join() Menghentikan Thread, kita telah melihat bahwa thread utama
dihentikan sebelum thread anak selesai dieksekusi. Terkadang, pada kasus-kasus pemrograman tertentu, kita ingin
menjadikan thread utama sebagai thread yang terakhir dihentikan. Untuk melakukan hal tersebut, kita perlu memanggil method
join() pada semua thread anak.
Estu Sinduningrum, ST, MT
Mengenal Method is Alive() dan join() Apabila kita ingin mengetahui apakah suatu thread masih dalam
keadaan aktif atau tidak, kita dapat memanggil method isAlive(). Baik method join() maupun isAlive(), keduanya didefinisikan di dalam kelas thread. Berikut ini bentuk umum deklarasi dari method isArive().
final boolean isAlive()
Estu Sinduningrum, ST, MT
Estu Sinduningrum, ST, MT
Mengenal Method is Alive() dan join()
Method ini dideklarasikan sebagai final, yang berarti tidak dapat
dioverride oleh kelas-kelas turunan. Nilai yang dikembalikan berupa boolean. Apabila threed masih dalam keadaan aktif (masih berjalan) maka method ini mengembalikan nilai true; bila sebaliknya, maka nilai yang dikembalikan adalah false. Final void join() throws InterruptedException Method join() digunakan untuk menunggu sampai objek thread
pemanggil benar-benar selesai dieksekusi.
Latihan 105
class MyThread implements Runnable { private Thread t; private int n; MyThread(String nama, int n) { t = new Thread(this, nama); this.n = n; } public void run() { try { for (int i=0; i
t1.start(); t2.start(); t3.start(); // pada saat thread t1, t2, dan t3 aktif System.out.println("t1.getThread().isAlive() : " + t1.getThread().isAlive()); System.out.println("t2.getThread().isAlive() : " + t2.getThread().isAlive()); System.out.println("t3.getThread().isAlive() : " + t3.getThread().isAlive()); System.out.println(); // menunggu sampai thread t1, t2, dan t3 selesai dieksekusi t1.getThread().join(); t2.getThread().join(); t3.getThread().join(); // setelah thread t1, t2, dan t3 selesai System.out.println(); System.out.println("t1.getThread().isAlive() : " + t1.getThread().isAlive()); System.out.println("t2.getThread().isAlive() : " + t2.getThread().isAlive()); System.out.println("t3.getThread().isAlive() : " + t3.getThread().isAlive()); System.out.println("\nThread utama selesai"); } }
Menentukan Prioritas Thread Prioritas thread digunakan oleh penjadwal thread (thread scheduler)
untuk menentukan thread mana yang seharusnya dikerjakan terlebih dahulu. Secara teori, thread dengan prioritas lebih tinggi akan mendapatkan waktu CPU yang lebih apabila dibandingkan dengan thread yang memiliki prioritas lebih rendah. Namun, pada praktiknya, jumlah waktu CPU yang didapatkan oleh thread terkadang tergantung pula pada beberapa faktor lain, selain dari prioritasnya. Sebagai contoh, bagaimana sistem operasi mengimplementasikan proses multitasking juga akan mempengaruhi ketersediaan waktu CPU. Estu Sinduningrum, ST, MT
Menentukan Prioritas Thread Thread dengan prioritas lebih tinggi juga dapat mengesampingkan
thread dengan prioritas lebih rendah. Sebagai contoh, apabila terdapat thread dengan prioritas rendah
sedang berjalan dan kemudian thread dengan prioritas tinggi diresume atau dijalankan ulang (dari keadaan wait maupun sleep), maka
thread
dikesampingkan.
Estu Sinduningrum, ST, MT
dengan
prioritas
rendah
tersebut
akan
Menentukan Prioritas Thread Untuk menentukan prioritas suatu threcd, kita harus memanggil
method setPriority ( ) yang didefinisikan pada kelas thread. Method tersebut memiliki bentuk umum seperti berikut:
final void setPriority (int level) Dalam hal ini, level digunakan untuk menentukan prioritas thread, dan nilainya harus berada dalam rentang MIN_PRIORITY sampai MAX_PRIORITY yaitu dari 1 sampai 10. Prioritas default ditentukan dengan NORM_PRIORITY yang
memiliki nilai 5. Estu Sinduningrum, ST, MT
Menentukan Prioritas Thread Kita dapat rnemperoleh informasi tentang prioritas suatu thread
dengan memanggil method setPriority(), yang juga didefinisikan pada kelas thread. Berikut ini bentuk umum dari method tersebut.
final int getPriority ()
Estu Sinduningrum, ST, MT
Contoh Program Contoh program berikut ini akan mendemonstrasikan cara kerja dua
buah thread yang memiliki prioritas berbeda. Prioritas dari thread pertama akan di-set dengan nilai dua di atas prioritas normal (Thread.NORM_PRIORITY), sedangkan prioritas thread kedua di-set dengan nilai dua di bawah prioritas normal. Masing-masing thread akan mengeksekusi sebuah pengulangan, dan keduanya akan dijalankan selama 5 detik serta dihentikan secara bersama-sama. Melalui cara ini, kita akan melihat bahwa thread dengan prioritas lebih tinggi akan menghasilkan jumlah pengulangan yang lebih banyak dibandingkan dengan jumlah pengulangan yang dihasilkan Estu Sinduningrum, ST, MT
Latihan 106
class MyThread implements Runnable { private Thread t; private long n; // jumlah pengulangan yang dihasilkan private boolean selesai = false; MyThread(String nama, int prioritas) { t = new Thread(this, nama); t.setPriority(prioritas); n = 0; } public void run() { while (!selesai) { n++; } } public void start() { t.start(); } public void stop() { selesai = true; } public long getN() { return n; } public Thread getThread() { return t; Estu Sinduningrum, ST, MT } }
class DemoPrioritasThread { public static void main(String[] args) throws InterruptedException { MyThread t1 = new MyThread("prioritas-tinggi", Thread.NORM_PRIORITY + 2); MyThread t2 = new MyThread("prioritas-rendah", Thread.NORM_PRIORITY - 2); t1.start(); t2.start(); // mengistirahatkan thread utama selama 5 detik Thread.sleep(5000); t1.stop(); t2.stop(); t1.getThread().join(); t2.getThread().join(); System.out.println("Jumlah pengulangan pada " + t1.getThread().getName() + ": " + t1.getN()); System.out.println("Jumlah pengulangan pada " + t2.getThread().getName() + ": " + t2.getN()); } }
Estu Sinduningrum, ST, MT
Sinkronisasi
Thread-thread dalam sebuah program saling membagi ruang
memori,ini artinya thread-threod tersebut juga dapat saling berbagi resource. Pada saat dua atau lebih thread perlu mengakses resource yang di
share, maka dibutuhkan suatu cara untuk meyakinkan bahwa, resource tersebut hanya akan digunakan oleh satu buah thread pada satu waktu tertentu. Cara atau proses yang digunakan untuk mengatasi hal ini disebut
dengan sinkronisasi.
Sinkronisasi Apabila method dari suatu objek hanya ingin dieksekusi oleh satu
thread
dalam
suatu
waktu
tertentu, maka
kita
harus
mendeklarasikan method tersebut dengan kata kunci synchronizea. Berikut ini contoh bentuk deklarasinya: public synchronized void test() { // kode yang akan dilakukan }
Estu Sinduningrum, ST, MT
Latihan 107
class TestKelas { public synchronized void test(String s) { System.out.print("[" + s); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("]"); } } class MyThread implements Runnable { private TestKelas obj; private Thread t; private String msg; MyThread(TestKelas obj, String msg) { t = new Thread(this); this.obj = obj; this.msg = msg; t.start(); } Estu Sinduningrum, ST, MT
public void run() { obj.test(msg); } } class DemoSinkronisasiMethod { public static void main(String[] args) throws InterruptedException { TestKelas tk = new TestKelas(); MyThread t1 = new MyThread(tk, "Contoh"); MyThread t2 = new MyThread(tk, "Sinkronisasi"); MyThread t3 = new MyThread(tk, "Method"); } }
BIok untuk Sinkronisasi Meskipun pembuatan method yang di-sinkronisasi (synchronized
method) mudah diimplementasikan untuk melakukan proses sinkronisasi antar-thread, akan tetapi cara tersebut tidak selalu dapat
diterapkan ke dalam setiap kasus. Sebagai contoh kasus, Anda ingin menggunakan kelas yang Anda
download dari internet, sedangkan kode dari kelas tersebut tidak
diberikan.
Estu Sinduningrum, ST, MT
BIok untuk Sinkronisasi Bagaimana Anda dapat melakukan sinkronisasi terhadap suatu
method yang terdapat pada kelas tersebut dari thread-thread yang kita buat? Untuk menambahkan kata kunci synchronized pada deklarasi
method di dalam kelas tersebut, ini jelas tidak mungkin karena tidak ada kode program untuk kelas tersebut. Lantas, apa solusinya?
Estu Sinduningrum, ST, MT
Estu Sinduningrum, ST, MT
BIok untuk Sinkronisasi Lantas, apa solusinya? Untuk menjawab kasus semacam ini, Java telah menyediakan cara
yang mungkin lebih bersifat fleksibel, yaitu dengan membuat sebuah blok sinkronisasi. Anda hanya perlu meletakkan method dari kelas tersebut di dalam blok sinkronisasi. Adapun bentuk umum dari pembuatan blok sinkronisasi sebagai berikut : synchronized(object) { / / statemen- statemen y ang akan di- sinkronisasi }
Latihan 108
class TestKelas { // di sini, method test() tidak di-sinkronisasi public void test(String s) { System.out.print("[" + s); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("]"); } } class MyThread implements Runnable { private TestKelas obj; private Thread t; private String msg; MyThread(TestKelas obj, String msg) { t = new Thread(this); this.obj = obj; this.msg = msg; Estu Sinduningrum, ST, MT t.start(); }
public void run() { // membuat blok sinkronisasi synchronized(obj) { // di sini, method test() akan disinkronisasi obj.test(msg); } } } class DemoBlokSinkronisasi { public static void main(String[] args) throws InterruptedException { TestKelas tk = new TestKelas(); MyThread t1 = new MyThread(tk, "Contoh"); MyThread t2 = new MyThread(tk, "Sinkronisasi"); MyThread t3 = new MyThread(tk, "Method"); } }
TERIMA KASIH