Suatu program komputer, bahasa pemrograman apapun, biasanya akan mengeksekusi kode dengan urutan dari kiri ke kanan, atas ke bawah. Baris perintah nomer 10 akan dieksekusi setelah nomer 9 selesai, dan tentunya itu setelah nomer 8 selesai. Dan jangan harap nomer 7 akan dieksekusi apabila nomer 1 belum selesai.
Jadi maksudnya? bayangkan misalnya kita akan membuat program yang akan mencetak output sederhana, kita butuh untuk mencetak angka 1 sampai dengan 10 secara berurutan. Gampang bukan?
1 2 3 4 | for(int i = 1; i <= 10; i++) { System.out.println("baris ke " + i); } |
beres urusannya.
Kemudian bayangkan, kita harus mencetak 2 kali angka 1 sampai dengan 10 secara berurutan. tentunya akan lebih mudah jika menggunakan snippet berikut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class test { public void cetak() { for(int i = 1; i <= 10; i++) { System.out.println("Baris ke " + i); } } } public static void main(String arg[]) { test t = new test(); t.cetak(); test t2 = new test(); t2.cetak(); } |
Jika script tersebut dijalankan (dengan aturan main Java yang benar tentunya), maka akan memberikan output berupa cetak baris sebanyak 20 buah dengan urutan 1 sampai dengan 10, 2 kali. Sederhana bukan?
Tetapi, bagaimana jika dihadapkan dengan kasus seperti ini; kita diharuskan memberikan output dari 2 fungsi secara bersamaan atau hampir bersamaan. Pada contoh diatas, fungsi t2.cetak()
yang kedua baru akan dijalankan apabila t.cetak()
sudah selesai dijalankan. Dan kita, diharuskan membuat program dengan kondisi, misalnya, t2.cetak
harus dijalankan tanpa harus menunggu t1.cetak()
selesai. Bagaimana caranya? Gampang, buat saja 2 program, jalankan bersamaan! Beres kan?
Tentu saja bukan begitu. Tapi untuk mempermudah ilustrasi kebutuhan, bayangkan saya menjalankan 2 program bersamaan. nah, tentunya program yang 1 tidak akan menunggu program lain selesai baru dieksekusi bukan? Tapi, tentu saja itu boros resources komputer, belum lagi, kita kan tidak selalu mengetahui berapa program yang harus berjalan?
Java support kemampuan multithreading. Dengan multithreading ini, kita bisa membuat program kita menjalankan lebih dari 1 fungsi secara bersamaan atau hampir bersamaan. Perhatikan komputer yang anda gunakan, terdiri dari berapa (core) CPU? 2, 4, 8, atau mungkin lebih? Ketika sebuah program berjalan, sebenarnya itu hanya menggunakan satu CPU saja. Bagaimana dengan CPU lainnya? tentu saja digunakan oleh program lainnya dong.
Dengan kemampuan multithreading, kita bisa membuat program kita mengkonsumsi CPU yang sedang idle, agar dapat mengerjakan suatu pekerjaan dengan lebih cepat. Oke, program tadi kita ubah
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 31 32 33 34 35 | // buat di file tersendiri public class threadSample extends Thread { private String name; threadSample(String name) { this.name = name; } @Override public void run() { for(int i = 1; i <= 10; i++) { System.out.println("th: " + this.name + ", cetak baris ke " + i); } System.out.println(this.name + " SELESAI"); System.out.println(); } } // yang ini juga harus di file tersendiri, sebagai main class dari aplikas kita public class mainApp { public static void main(String arg[]) { threadSample t1 = new threadSample("THREAD1"); t1.run(); threadSample t2 = new threadSample("THREAD2"); t2.run(); } } |
setelah dijalankan, aplikasi tersebut akan memberikan output
th: THREAD1, cetak baris ke 1 th: THREAD1, cetak baris ke 2 th: THREAD1, cetak baris ke 3 th: THREAD1, cetak baris ke 4 th: THREAD1, cetak baris ke 5 th: THREAD1, cetak baris ke 6 th: THREAD1, cetak baris ke 7 th: THREAD1, cetak baris ke 8 th: THREAD1, cetak baris ke 9 th: THREAD1, cetak baris ke 10 THREAD1 SELESAI th: THREAD2, cetak baris ke 1 th: THREAD2, cetak baris ke 2 th: THREAD2, cetak baris ke 3 th: THREAD2, cetak baris ke 4 th: THREAD2, cetak baris ke 5 th: THREAD2, cetak baris ke 6 th: THREAD2, cetak baris ke 7 th: THREAD2, cetak baris ke 8 th: THREAD2, cetak baris ke 9 th: THREAD2, cetak baris ke 10 THREAD2 SELESAI
Oops, masih nunggu ternyata. hehehe. t2 masih menunggu t1 selesai baru dijalankan. By the way, sekedar penjelasan sederhana, class threadSample itu meng-extends class Thread, yang merupakan class di Java yang memungkinkan fitur multithreading ini. Sedangkan method run()
adalah method yang harus kita sediakan jika ingin menggunakan class ini sebagai sebuah thread terpisah dari thread induknya.
Untuk menjalankan sebuah class sebagai thread terpisah, selain harus meng-override method run()
tersebut, class juga harus dieksekusi dengan method start()
.
Sekarang, kita ganti code diatas, pada bagian t1.run()
dan t2.run()
, ganti menjadi t1.start()
dan t2.start()
. Jalankan, hasil output akan menjadi mirip sepert:
th: THREAD2, cetak baris ke 1 th: THREAD1, cetak baris ke 1 th: THREAD2, cetak baris ke 2 th: THREAD1, cetak baris ke 2 th: THREAD2, cetak baris ke 3 th: THREAD1, cetak baris ke 3 th: THREAD2, cetak baris ke 4 th: THREAD1, cetak baris ke 4 th: THREAD2, cetak baris ke 5 th: THREAD1, cetak baris ke 5 th: THREAD2, cetak baris ke 6 th: THREAD1, cetak baris ke 6 th: THREAD2, cetak baris ke 7 th: THREAD1, cetak baris ke 7 th: THREAD2, cetak baris ke 8 th: THREAD1, cetak baris ke 8 th: THREAD2, cetak baris ke 9 th: THREAD1, cetak baris ke 9 th: THREAD2, cetak baris ke 10 th: THREAD1, cetak baris ke 10 THREAD2 SELESAI THREAD1 SELESAI
Itulah dia, t2 berjalan tanpa harus menunggu t1 selesai. Multithreading bisa digunakan misalnya, pada HTTP server. Bayangkan thread utama berjalan dan menunggu koneksi, begitu ada koneksi terjadi, langsung menciptakan thread baru untuk menangani request yang ada dan thread utama tadi siap lagi jika ada koneksi yang lain. Hal ini tentunya mempercepat proses dan juga meningkatkan performance system.
Semoga berguna untuk kita semua.
UPDATE, contoh aplikasi multithread yang lebih dalam, di post yang ini.