Benang Jawa
Benang Jawa
Utas memungkinkan program untuk beroperasi lebih efisien dengan melakukan banyak hal secara bersamaan.
Utas dapat digunakan untuk melakukan tugas rumit di latar belakang tanpa mengganggu program utama.
Membuat Utas
Ada dua cara untuk membuat utas.
Itu dapat dibuat dengan memperluas Thread
kelas dan mengganti run()
metodenya:
Perluas Sintaks
public class Main extends Thread { public void run() { System.out.println("This code is running in a thread");
}}
Cara lain untuk membuat utas adalah dengan mengimplementasikan Runnable
antarmuka:
Terapkan Sintaks
public class Main implements Runnable {
public void run() {
System.out.println("This code is running in a thread");
}
}
Menjalankan Thread
Jika kelas memperluas Thread
kelas, utas dapat dijalankan dengan membuat instance kelas dan memanggil start()
metodenya:
Perpanjang Contoh
public class Main extends Thread {
public static void main(String[] args) {
Main thread = new Main();
thread.start();
System.out.println("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
Jika kelas mengimplementasikan Runnable
antarmuka, utas dapat dijalankan dengan meneruskan instance kelas ke Thread
konstruktor objek dan kemudian memanggil metode utas
start()
:
Menerapkan 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("This code is outside of the thread");
}
public void run() {
System.out.println("This code is running in a thread");
}
}
Perbedaan antara "memperluas" dan "menerapkan" Utas
Perbedaan utama adalah bahwa ketika sebuah kelas memperluas kelas Thread, Anda tidak dapat memperluas kelas lain, tetapi dengan mengimplementasikan antarmuka Runnable, dimungkinkan untuk memperluas dari kelas lain juga, seperti: class MyClass extends OtherClass implements Runnable
.
Masalah Konkurensi
Karena utas berjalan pada saat yang sama dengan bagian lain dari program, tidak ada cara untuk mengetahui urutan kode yang akan dijalankan. Ketika utas dan program utama membaca dan menulis variabel yang sama, nilainya tidak dapat diprediksi. Masalah yang dihasilkan dari ini disebut masalah konkurensi.
Contoh
Contoh kode di mana nilai jumlah variabel tidak dapat diprediksi:
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); System.out.println(amount); amount++; System.out.println(amount);
}public void run() { amount++;
}}
Untuk menghindari masalah konkurensi, yang terbaik adalah berbagi atribut antar utas sesedikit mungkin. Jika atribut perlu dibagikan, salah satu solusi yang mungkin adalah menggunakan isAlive()
metode utas untuk memeriksa apakah utas telah selesai berjalan sebelum menggunakan atribut apa pun yang dapat diubah oleh utas.
Contoh
Gunakan isAlive()
untuk mencegah masalah konkurensi:
public class Main extends Thread { public static int amount = 0; public static void main(String[] args) { Main thread = new Main(); thread.start(); // Wait for the thread to finish while(thread.isAlive()) { System.out.println("Waiting...");
}// Update amount and print its value System.out.println("Main: " + amount); amount++; System.out.println("Main: " + amount);
}public void run() { amount++;
}}