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 Threadkelas 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 Runnableantarmuka:

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 Threadkelas, 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 Runnableantarmuka, utas dapat dijalankan dengan meneruskan instance kelas ke Threadkonstruktor 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++;
  }
}