Java Thread
Thread memungkinkan sebuah program untuk beroperasi lebih efisien dengan melakukan banyak hal pada satu waktu. Thread dapat digunakan untuk melakukan tugas rumit sebagai proses yang berjalan sebagai latar belakang tanpa mengganggu program utama.
Membuat Sebuah thread
Terdapat dua cara membuat sebuah thread. Bisa dibuat dengan membuat sub class dari class Thread dan mengganti method run() :
public class Main extends Thread {
public void run() {
System.out.println("Kode ini berjalan di dalam sebuah thread");
}
}
Cara lain untuk membuat sebuah thread adalah dengan membuat sebuah class yang implements interface Runnable :
public class Main implements Runnable {
public void run() {
System.out.println("Kode ini berjalan di dalam sebuah thread");
}
}
Menjalankan thread
Jika menggunakan class sebagai sub class dari class Thread, thread dapat dijalankan dengan membuat instance class dan memanggil method start() :
public class Main extends Thread {
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("Kode ini berjalan di luar thread");
}
public void run() {
System.out.println("Kode ini berjalan di dalam thread");
}
}
Output :
Kode ini berjalan di luar thread
Kode ini berjalan di dalam thread
Jika menggunakan class yang implement interface Runnable, thread dapat dijalankan dengan meneruskan instance class ke constructor object Thread dan memanggil method start(). Contoh :
public class Main implements Runnable {
public static void main(String[] args) {
Main obj = new Main();
Thread thread = new Thread(obj);
thread.start();
System.out.println("Kode ini berjalan di luar thread");
}
public void run() {
System.out.println("Kode ini berjalan di dalam thread");
}
}
Output :
Kode ini berjalan di luar thread
Kode ini berjalan di dalam thread
Perbedaan Antara Extends Dan Implements Pada Thread
Perbedaan utama adalah ketika menggunakan sub class dari class Thread maka Anda tidak dapat menggunakan extends dari class yang lainnya, tapi dengan menggunakan implement interface Runnable, memungkinkan untuk membuat sub class dari class lain juga, seperti contoh class ClassSaya extends ClassLain implements Runnable.
Masalah Concurrency
Karena thread berjalan pada saat yang sama dengan bagian lain dari program, tidak ada cara untuk mengetahui urutan kode yang akan dijalankan. Ketika thread dan program utama membaca dan menulis variabel yang sama, nilainya tidak dapat diprediksi. Masalah yang dihasilkan ini disebut masalah concurrency. Contoh, nilai dari variabel jumlah di bawah ini tidak bisa diprediksi :
public class Main extends Thread {
public static int jumlah = 0;
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println(jumlah);
jumlah++;
System.out.println(jumlah);
}
public void run() {
jumlah++;
}
}
Output :
0
1
Untuk menghindari masalah konkurensi, cara terbaik adalah berbagi atribut sesedikit mungkin di antara thread. Jika atribut perlu untuk dibagikan, salah satu solusi yang mungkin adalah menggunakan method isAlive() dari thread untuk memeriksa apakah thread telah selesai berjalan sebelum menggunakan atribut apa pun yang dapat diubah oleh thread. Contoh di bawah ini menggunakan method isAlive() untuk mencegah masalah concurrency :
public class Main extends Thread {
public static int jumlah = 0;
public static void main(String[] args) {
Main thread = new Main();
thread.start();
// Menunggu thread selesai
while(thread.isAlive()) {
System.out.println("Menunggu...");
}
// Update jumlah dan mencetak nilai
System.out.println("Main: " + jumlah);
jumlah++;
System.out.println("Main: " + jumlah);
}
public void run() {
jumlah++;
}
}
Output :
Menunggu...
Menunggu...
Menunggu...
Menunggu...
Menunggu...
Main: 1
Main: 2
Tutorial sebelumnya : Java Regular Expressions
Tutorial setelahnya : Java Lambda Expressions
Semua Tutorial JAVA : Tutorial JAVA