Java merupakan salah satu bahasa yang telah mendukung pengembangan aplikasi multithreading (banyak thread). Thread dapat dianalogikan sebagai suatu sub-proses yang ada dalam proses. dengan menggunakan thread maka aplikasi yang dibangun dapat menjalankan banyak aktivitas secara konkuren.
Multithreading memiliki keunggulan dibandingkan Multiprocessing yaitu sebagai berikut:
Multithreading memiliki keunggulan dibandingkan Multiprocessing yaitu sebagai berikut:
- Thread lebih ringan dibandingkan dengan proses
- Thread dapat berbagi data dan kode
- Switching antar Thread jauh lebih hemat cpu dari pada process
- Thread memungkinkan tugas yang berbeda yang akan dilakukan secara bersamaan
Thread dalam java dapat diilustrasikan oleh gambar berikut:
secara umum siklus dari setiap thread dalam java adalah sebagai berikut:
terdapat 2 cara yang dapat digunakan untuk menciptakan thread dalam java,yaitu:
- dengan mengimplementasikan Runnable Interface (java.lang.Runnable)
- dengan meng-extends kan Thread Class (java.lang.Extends)
Dalam Java kita dapat membuat prioritas suatu thread relative terhadapat thread yang lain, sehingga thread yang mempunyai prioritas lebih tinggi mempunyai kesempatan lebih besar untuk mengakses suatu sources Java Virtual Machine memilih thread yang runnable dengan prioritas tertinggi. Semua thread java mempunyai
prioritas dari 1 sampai 10. Prioritas tertinggi 10 dan berakhir dengan 1 sebagai prioritas terendah. Sedangkan prioritas normal adalah 5.
- Thread.MIN_PRIORITY (thread dengan prioritas terendah)
- Thread.MAX_PRIORITY (thread dengan prioritas tertinggi)
- Thread.NORM_PRIORITY (thread dengan prioritas normal)
Saat thread baru dibuat ia mempunyai prioritas yang sama dengan thread yang menciptakannya. Prioritas thread dapat diubah dengan menggunakan method setpriority(). Contoh penggunaan method setpriority() adalah sebagai berikut:
menghasilkan output berikut:
Sinkronisasi
Sinkronisasi adalah suatu proses pengendalian akses dari sumber daya terbagi pakai (shared resource) oleh banyak thread sedemikian sehingga hanya satu thread yang dapat mengakses sumber daya tertentu pada satu waktu. Terdapat 2 (dua) bagian kode yang dapat dikenakan sinkronisasi di dalam Java:
- Synchronized method
- Synchronized block
Komunikasi antar thread
1. wait()
Merupakan method yang menyebabkan thread terakhir yang mengakses objek melepaskan kunci objek dan menunggu sampai thread lain yang mengambil kunci objek tersebut melepaskannya kembali ke objek. Terdapat 2 jenis method wait(), yaitu:
- wait()
menunggu sampai waktu tak berhingga sampai ada thread yang menyerahkan kunci obyek kepada obyek bersangkutan. - wait (long timeout)menunggu ada thread yang menyerahkan kunci obyek kepada obyek bersangkutan sampai timeout dalam milidetik.
Merupakan method yang menyebabkan thread pemegang kunci obyek melepaskan kunci obyek dan obyek pemilik kunci memilih salah satu thread pada state blocked in object’s wait pool untuk diubah state-nya ke blocked in object’s lock pool.
3. notifyAll()
Merupakan method yang menyebabkan thread pemegang kunci obyek melepaskan kunci obyek dan obyek pemilik kunci memindahkan semua thread yang berada pada state blocked in object’s wait pool ke state blocked in object’s lock pool.
4. stop()
Method ini menyebabkan thread segera berhenti. Ini sering dijadikan cara tercepat untuk mengakhiri suatu thread khususnya jika method ini dieksekusi pada thread yang berlaku. Pada kasus ini, baris program setelah pemanggilan method stop() tidak pernah dieksekusi karena konteks jalinan musnah sebelum stop() selesai.
5. suspend()
Method suspend() berbeda dengan stop(). Method ini mengambil thread tertentu dan menyebabkannya berhenti tanpa menghancurkan thread di bawahnya atau keadaan thread yang berjalan sebelumnya. Jika suatu thread di-suspend, panggil method resume() pada thread yang sama untuk menjalankannya lagi.
6. resume()
Method ini digunakan untuk menghidupkan method yang di-suspend. Tidak ada jaminan bahwa thread yang dijalankan kembali akan berjalan dengan baik karena mungkin sudah ada thread dengan prioritas lebih tinggi yang berjalan. Tetapi, resume() memungkinkan thread untuk berjalan kembali.