Note: Karena beberapa hari ini kesibukan di kantor cukup tinggi, saya belum berkesempatan melanjutkan tutorial Blackberry Game Development kemarin (sorry about that again..). Sebagai gantinya, minggu ini saya akan mengeluarkan sebuah mini article lagi, hopefully minggu depan saya bisa meluangkan cukup waktu untuk melanjutkan tutorial kita kemarin. Kali ini kita akan membahas mengenai thread di Java: bukan mengenai membuat thread, namun lebih ke arah bagaimana kerjanya.
About Java Threads
Thread mungkin adalah salah satu tools (baca: class) yang sangat berguna dalam Java. Sebuah thread dapat digunakan untuk menjalankan sebuah code block di background, memungkinkan terjadinya multiple processing dalam Java. Ada 2 cara untuk membuat thread dalam Java:
- Meng-extend class Thread;
- Mengimplement interface Runnable.
Kedua cara di atas adalah benar, perbedaannya hanya jika kamu menggunakan interface Runnable, kamu perlu membuat method start dan stop sendiri sedang class Thread sudah menyediakan semua method yang diperlukan. Setelahnya, kamu hanya perlu meng-override method run dan mengisikan code yang ingin dijalankan di background.
Thread is not exactly “multiple processing”
Ini mungkin terdengar sedikit membingungkan, tapi multiple thread dalam Java tidak sepenuhnya dijalankan secara bersamaan. Pada kenyataannya, thread di Java dikontrol oleh metode yang kompleks yang disebut Thread Scheduling, di mana thread dijalankan blok-per-blok secara bergantian. Hanya saja, hal ini berlangsung dengan sangat cepat dan seamless, dan secara otomatis oleh system sehingga kita seringkali tidak menyadarinya.
Stages of a thread
Untuk memahami lifecycle dari sebuah thread, mari kita lihat berbagai state yang dialaminya:
1. Ready to run
Ini adalah posisi awal dari thread, tepat pada saat method start() dipanggil. Pada saat ini, thread tidak langsung dijalankan, namun dia didaftarkan ke dalam thread pool. Nantinya, thread scheduler akan melihat ke dalam pool dan memilih thread mana yang akan dijalankan berdasarkan thread priority.
2. Running
Thread tengah dijalankan oleh system. Sebuah thread akan terus berjalan kecuali di atas kondisi ini: system menukarnya secara otomatis, atau thread berada dalam kondisi blocked. Kita juga dapat memaksa thread yang tengah berjalan untuk diswap dengan memakai method Thread.yield().
3. Waiting
Thread memasuki posisi waiting bila method wait() dipanggil. Pada posisi ini, thread akan berhenti dan menunggu giliran hingga thread lain memanggil method notify() atau notifyAll() terhadapnya. Method ini dimiliki oleh semua object Java.
4. Sleeping
Thread akan memasuki posisi sleeping bila di method sleep() dipanggil. Pada posisi ini, thread akan berhenti eksekusinya hingga sejumlah waktu terlampaui. Setelah itu, thread akan kembali ke posisi ready to run.
5. Blocked
Thread akan masuk ke posisi blocked bila 1 dari 2 hal: Pertama, thread sedang menunggu proses I/O, seperti sedang membaca byte dari socket, atau thread sedang berusaha mengakses synchronized method. Proses akan dilanjutkan setelah data diterima, atau thread mendapatkan lock atas synchronized method tersebut.
6. Dead
Bila thread telah selesai mengeksekusi seluruh block atau menerima panggilan atas method stop(). Pada posisi ini, object thread akan dikeluarkan dari pool dan tidak bisa dieksekusi lagi. Untuk dapat mengeksekusi ulang, kita harus kembali membuat object-nya dan memanggil method start().
Multithreading in a mobile device
Pada mobile device, khususnya J2ME yang umumnya memiliki resource dan prosessor yang lebih kecil penggunaan multiple thread sebaiknya dikurangi karena cukup resource consuming. Bila memungkinkan, gunakan thread-thread yang waktu eksekusinya pendek sehingga tidak terlalu banyak thread yang berjalan bersamaan dan cukup satu thread utama yang terus aktif; atau kita bisa membuat sebuah thread manager class yang memantain thread-thread yang berjalan supaya lebih efektif. Namun kita akan membahas thread manager di lain kesempatan. Sekian untuk saat ini, dan semoga artikel ini cukup membantu rekan-rekan lebih memahami thread dalam Java
.