Multithreading mengacu kepada dua
atau lebih task (tugas, thread) yang berjalan (sedang dieksekusi) di dalam satu
program. Thread merupakan suatu path eksekusi independen di dalam program.
Banyak thread dapat nerjalan secara konkuren (berbarengan) di dalam program.
Setiap thread di dalam Java dibuat dan dikendalikan oleh kelas
java.lang.Thread. Suatu program Java dapat mempunyai banyak thread, dan
thread-thread ini dapat berjalan secara bersamaan, secara asinkron atau
sinkron.
Multithreading mempunyai beberapa
keuntungan, dibandingkan multiprocessing, di antaranya:
- Thread bersifat lightweight, sedangkan proses lebih berat. Perlu diketahui bahwa proses adalah program yang sedang berada di memory atau processor, sedang dieksekusi. Thread dapat diartikan sebagai anak dari proses.
- Thread-thread berbagi pakai ruang alamat yang sama dan karena itu dapat berbagi pakai data dan kode (instruksi)
- Context switching antar thread biasanya lebih murah daripada antar proses.
- Biaya komunikasi antar thread relatif lebih rendah daripada komunikasi antar proses.
- Thread memungkinkan task-task berbeda dikerjakan secara konkuren.
Kelas Thread merupakan turunan dari
kelas Object. Kelas Object sendiri mempunyai metode notify(), notifyAll() dan
wait(), sedangkan kelas Thread menyediakan metode sleep() dan yield().
Metode-metode ini akan sering digunakan dalam pengelolaan aplikasi banyak
thread.
Pembuatan Thread
Terdapat 2 (dua) cara membuat thread
di dalam Java:
- Mengimplementasikan interface Runnable (java.lang.Runnable)
- Menurunkan (extend) kelas Thread (java.lang.Thread)
Mengimplementasikan Interface
Runnable
Bentuk dasar (signature) dari
interface Runnable adalah
1
|
public interface Runnable {
|
|
2
|
void
run();
|
3
|
}
|
Pada pendekatan ini, kita harus
membuat sebuah kelas yang implementasi interface Runnable menggunakan kata
kunci implements Runnable. Kemudian dibuat instansiasi berupa suatu
obyek dari kelas itu. Kita perlu meng-override metode run() di dalam
kelas itu, satu-satunya metode yang perlu diimplementasikan. Metode run()
mengandung logika dari thread yang dibangun.
Prosedur pembuatan thread
berdasarkan pendekatan interface Runnable adalah sebagai berikut:
- Sebuah kelas meng-implements interface Runnable, menyediakan metode run() di dalamnya yang akan dieksekusi oleh thread nantinya. Obyek dari kelas ini merupakan obyek Runnable.
- Obyek dari kelas Thread dibuat dengan melewatkan obyek Runnable sebagai argumen ke konstruktur Thread. Obyek Thread sekarang mempunyai suatu obyek Runnable yang mengimplementasikan metode run().
- Metode start() pada obyek Thread yang dibuat sebelumnya dipanggil. Metode start() tersebut kembali segera setelah suatu thread dilahirkan (berhasil dibuat).
- Thread berakhir ketika metode run() berakhir, baik dengan penyelesaian normal atau dengan melempar suatu eksepsi tidak tertangkap (uncaught exception).
Di bawah ini adalah sebuah program
yang mengilustrasikan pembuatan thread menggunakan interfaca Runnable, bukan
meng-extend kelas Thread. Suatu thread dimulai ketika kita memanggil metode
start() pada obyek yang dibuat.
01
|
class RunnableThread implements
Runnable {
|
|
02
|
03
|
Thread runner;
|
|
04
|
05
|
public RunnableThread() { }
|
|
06
|
07
|
public RunnableThread(String threadName)
{
|
|
08
|
runner =
new Thread(this,
threadName); // (1) Buat thread baru.
|
09
|
System.out.println(runner.getName());
|
|
10
|
runner.start();
// (2) Memulai eksekusi thread tersebut.
|
11
|
}
|
|
12
|
13
|
public void
run() {
|
|
14
|
//Tampilkan
info tentang thread ini
|
15
|
System.out.println(Thread.currentThread());
|
|
16
|
}
|
17
|
}
|
|
18
|
19
|
public class RunnableExample {
|
|
20
|
21
|
public static void
main(String[] args) {
|
|
22
|
Thread
thread1 = new Thread(new RunnableThread(),
"thread1");
|
23
|
Thread thread2
= new Thread(new RunnableThread(),
"thread2");
|
|
24
|
RunnableThread
thread3 = new RunnableThread("thread3");
|
25
|
||
26
|
//Memulai
eksekusi thread.
|
27
|
thread1.start();
|
28
|
thread2.start();
|
29
|
try {
|
|
30
|
//delay
selama satu detik (1000 ms).
|
31
|
Thread.currentThread().sleep(1000);
|
|
32
|
} catch (InterruptedException e)
{ }
|
33
|
||
34
|
//Tampilkan
info tentang thread main (utama).
|
35
|
System.out.println(Thread.currentThread());
|
|
36
|
}
|
37
|
}
|
Keluaran dari Program di atas dapat
berupa:
thread3
Thread[thread1,5,main]
Thread[thread2,5,main]
Thread[thread3,5,main]
Thread[main,5,main]private
Thread[thread1,5,main]
Thread[thread2,5,main]
Thread[thread3,5,main]
Thread[main,5,main]private
Pendekatan ini harus digunakan jika
kelas yang menginstansiasi obyek thread diperlukan (sebagai parent) untuk
membuat kelas-kelas lain yang merupakan keturunannya. Pada kasus demikian, kita
tidak boleh menurunkan kelas Thread, harus mengimplementasikan Runnable.
Meng-Extend Kelas Thread
Prosedur pembuatan thread melalui
pendekatan penurunan kelas Thread adalah sebagai berikut:
- Membuat sebuah sub-kelas turunan dari kelas Thread, kemudian meng-override metode run() dari kelas Thread dan di dalamnya didefinisikan beberapa kode yang dieksekusi oleh thread.
- Sub-kelas ini dapat memanggil suatu konstruktur Thread secara eksplisit untuk menginisialisasi thread, menggunakan metode super().
- Metode start() yang telah diturunkan (secara otomatis) dari kelas Thread dipanggil agar thread segera berjalan.
Berikut ini adalah sebuah program
yang mengilustrasikan pembuatan thread dengan meng-extend kelas Thread sebagai
ganti mengimplementasikan interface Runnable. Metode start() digunakan untuk
mengeksekusi obyek thread yang dibuat.
01
|
class XThread extends
Thread {
|
|
02
|
03
|
XThread() { }
|
|
04
|
05
|
XThread(String threadName) {
|
|
06
|
super(threadName);
// Memulai thread.
|
07
|
System.out.println(this);
|
|
08
|
start();
|
09
|
}
|
|
10
|
11
|
public void
run() {
|
|
12
|
//Tampilkan
info tentang thread ini
|
13
|
System.out.println(Thread.currentThread().getName());
|
|
14
|
}
|
15
|
}
|
|
16
|
17
|
public class ThreadExample {
|
|
18
|
19
|
public static void
main(String[] args) {
|
|
20
|
Thread
thread1 = new Thread(new XThread(), "thread1");
|
21
|
Thread
thread2 = new Thread(new XThread(), "thread2");
|
|
22
|
23
|
// 2
thread diberikan nama default
|
|
24
|
Thread
thread3 = new XThread();
|
25
|
Thread
thread4 = new XThread();
|
|
26
|
Thread
thread5 = new XThread("thread5");
|
27
|
||
28
|
//Memulai
eksekusi thread
|
29
|
thread1.start();
|
30
|
thread2.start();
|
31
|
thread3.start();
|
32
|
thread4.start();
|
33
|
try {
|
|
34
|
//Metode sleep() dipanggil pada
thred main (utama), delay 1 detik.
|
35
|
Thread.currentThread().sleep(1000);
|
|
36
|
} catch (InterruptedException e) { }
|
37
|
||
38
|
//Tampilkan
info tentang thread main
|
39
|
System.out.println(Thread.currentThread());
|
|
40
|
}
|
41
|
}
|
Keluaran yang diperoleh dapat
berupa:
Thread[thread5,5,main]
thread1
thread5
thread2
Thread-3
Thread-2
Thread[main,5,main]
thread1
thread5
thread2
Thread-3
Thread-2
Thread[main,5,main]
Pada saat membuat thread, ada dua
alasan mengapa kita mengimplementasikan interface Runnable, bukan meng-extend
kelas Thread:
- Menurunkan kelas Thread berarti bahwa subclass tidak dapat diturunkan menjadi kelas lain lagi, sedangkan suatu kelas yang mengimplementasikan interface Runnable mempunyai opsi ini.
- Suatu kelas mungkin hanya diinginkan runnable, karena itu menurunkan Thread secara penuh merupakan pemborosan.
Contoh dari kelas anonim berikut
memperlihatkan bagaimana membuat sebuah thread dan langsung menjalankannya:
1
|
( new Thread() {
|
|
2
|
public
void run()
{
|
3
|
for(;;)
System.out.println(”Stop the world!”);
|
|
4
|
}
|
5
|
}
|
|
6
|
).start();
|
Langganan:
Posting Komentar (Atom)
Posting Komentar