Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> java

Java - Multithreading

Java adalah bahasa pemrograman multi-utas yang berarti kita dapat mengembangkan program multi-threaded menggunakan Java. Program multi-utas berisi dua atau lebih bagian yang dapat berjalan secara bersamaan dan setiap bagian dapat menangani tugas yang berbeda pada saat yang sama dengan memanfaatkan sumber daya yang tersedia secara optimal khususnya ketika komputer Anda memiliki banyak CPU.

Menurut definisi, multitasking adalah ketika beberapa proses berbagi sumber daya pemrosesan umum seperti CPU. Multi-threading memperluas gagasan multitasking ke dalam aplikasi di mana Anda dapat membagi operasi tertentu dalam satu aplikasi menjadi thread individu. Setiap utas dapat berjalan secara paralel. OS membagi waktu pemrosesan tidak hanya di antara aplikasi yang berbeda, tetapi juga di antara setiap utas dalam aplikasi.

Multi-threading memungkinkan Anda untuk menulis dengan cara di mana beberapa aktivitas dapat berjalan secara bersamaan dalam program yang sama.

Siklus Hidup sebuah Thread

Sebuah thread melewati berbagai tahap dalam siklus hidupnya. Misalnya, utas lahir, dimulai, berjalan, dan kemudian mati. Diagram berikut menunjukkan siklus hidup lengkap dari sebuah thread.

Berikut tahapan daur hidup

Prioritas Utas

Setiap utas Java memiliki prioritas yang membantu sistem operasi menentukan urutan utas yang dijadwalkan.

Prioritas utas Java berada dalam kisaran antara MIN_PRIORITY (konstanta 1) dan MAX_PRIORITY (konstanta 10). Secara default, setiap utas diberi prioritas NORM_PRIORITY (konstanta 5).

Utas dengan prioritas lebih tinggi lebih penting untuk suatu program dan harus dialokasikan waktu prosesor sebelum utas dengan prioritas lebih rendah. Namun, prioritas utas tidak dapat menjamin urutan pelaksanaan utas dan sangat bergantung pada platform.

Buat Thread dengan Menerapkan Antarmuka yang Dapat Dijalankan

Jika kelas Anda dimaksudkan untuk dieksekusi sebagai utas, maka Anda dapat mencapainya dengan menerapkan Runnable antarmuka. Anda harus mengikuti tiga langkah dasar

Langkah 1

Sebagai langkah pertama, Anda perlu mengimplementasikan metode run() yang disediakan oleh Runnable antarmuka. Metode ini menyediakan titik masuk untuk utas dan Anda akan memasukkan logika bisnis lengkap Anda ke dalam metode ini. Berikut ini adalah sintaks sederhana dari metode run() −

public void run( )

Langkah 2

Sebagai langkah kedua, Anda akan membuat instance Utas objek menggunakan konstruktor berikut

Thread(Runnable threadObj, String threadName);

Dimana, threadObj adalah turunan dari kelas yang mengimplementasikan Runnable antarmuka dan nama thread adalah nama yang diberikan untuk utas baru.

Langkah 3

Setelah objek Thread dibuat, Anda dapat memulainya dengan memanggil start() metode, yang mengeksekusi panggilan ke metode run(). Berikut ini adalah sintaks sederhana dari metode start() −

void start();

Contoh

Berikut adalah contoh yang membuat utas baru dan mulai menjalankannya

Demo Langsung
class RunnableDemo implements Runnable {
   private Thread t;
   private String threadName;
   
   RunnableDemo( String name) {
      threadName = name;
      System.out.println("Creating " +  threadName );
   }
   
   public void run() {
      System.out.println("Running " +  threadName );
      try {
         for(int i = 4; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
            // Let the thread sleep for a while.
            Thread.sleep(50);
         }
      } catch (InterruptedException e) {
         System.out.println("Thread " +  threadName + " interrupted.");
      }
      System.out.println("Thread " +  threadName + " exiting.");
   }
   
   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class TestThread {

   public static void main(String args[]) {
      RunnableDemo R1 = new RunnableDemo( "Thread-1");
      R1.start();
      
      RunnableDemo R2 = new RunnableDemo( "Thread-2");
      R2.start();
   }   
}

Ini akan menghasilkan hasil berikut

Keluaran

Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread: Thread-1, 4
Running Thread-2
Thread: Thread-2, 4
Thread: Thread-1, 3
Thread: Thread-2, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-1, 1
Thread: Thread-2, 1
Thread Thread-1 exiting.
Thread Thread-2 exiting.

Buat Thread dengan Memperluas Kelas Thread

Cara kedua untuk membuat utas adalah dengan membuat kelas baru yang memperluas Utas kelas menggunakan dua langkah sederhana berikut. Pendekatan ini memberikan lebih banyak fleksibilitas dalam menangani beberapa utas yang dibuat menggunakan metode yang tersedia di kelas Utas.

Langkah 1

Anda harus mengganti run() metode yang tersedia di kelas Thread. Metode ini menyediakan titik masuk untuk utas dan Anda akan memasukkan logika bisnis lengkap Anda ke dalam metode ini. Berikut ini adalah sintaks sederhana dari metode run() −

public void run( )

Langkah 2

Setelah objek Thread dibuat, Anda dapat memulainya dengan memanggil start() metode, yang mengeksekusi panggilan ke metode run(). Berikut ini adalah sintaks sederhana dari metode start() −

void start( );

Contoh

Berikut adalah program sebelumnya yang ditulis ulang untuk memperpanjang Thread

Demo Langsung
class ThreadDemo extends Thread {
   private Thread t;
   private String threadName;
   
   ThreadDemo( String name) {
      threadName = name;
      System.out.println("Creating " +  threadName );
   }
   
   public void run() {
      System.out.println("Running " +  threadName );
      try {
         for(int i = 4; i > 0; i--) {
            System.out.println("Thread: " + threadName + ", " + i);
            // Let the thread sleep for a while.
            Thread.sleep(50);
         }
      } catch (InterruptedException e) {
         System.out.println("Thread " +  threadName + " interrupted.");
      }
      System.out.println("Thread " +  threadName + " exiting.");
   }
   
   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class TestThread {

   public static void main(String args[]) {
      ThreadDemo T1 = new ThreadDemo( "Thread-1");
      T1.start();
      
      ThreadDemo T2 = new ThreadDemo( "Thread-2");
      T2.start();
   }   
}

Ini akan menghasilkan hasil berikut

Keluaran

Creating Thread-1
Starting Thread-1
Creating Thread-2
Starting Thread-2
Running Thread-1
Thread: Thread-1, 4
Running Thread-2
Thread: Thread-2, 4
Thread: Thread-1, 3
Thread: Thread-2, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-1, 1
Thread: Thread-2, 1
Thread Thread-1 exiting.
Thread Thread-2 exiting.

Metode Utas

Berikut adalah daftar metode penting yang tersedia di kelas Thread.

No.Pr. Metode &Deskripsi
1

mulai batal publik()

Memulai utas di jalur eksekusi yang terpisah, lalu memanggil metode run() pada objek Utas ini.

2

public void run()

Jika objek Thread ini dibuat menggunakan target Runnable yang terpisah, metode run() akan dipanggil pada objek Runnable tersebut.

3

public final void setName(Nama string)

Mengubah nama objek Thread. Ada juga metode getName() untuk mengambil nama.

4

setPriority batal akhir publik(prioritas int)

Menetapkan prioritas objek Thread ini. Nilai yang mungkin antara 1 dan 10.

5

public final void setDaemon(boolean on)

Parameter true menunjukkan Thread ini sebagai thread daemon.

6

penggabungan batal akhir publik (milidetik panjang)

Utas saat ini memanggil metode ini pada utas kedua, menyebabkan utas saat ini memblokir hingga utas kedua berakhir atau jumlah milidetik yang ditentukan berlalu.

7

interupsi kekosongan publik()

Menginterupsi utas ini, menyebabkannya melanjutkan eksekusi jika diblokir karena alasan apa pun.

8

boolean final publik isAlive()

Mengembalikan nilai true jika utas masih hidup, yaitu kapan pun setelah utas dimulai tetapi sebelum berjalan hingga selesai.

Metode sebelumnya dipanggil pada objek Thread tertentu. Metode berikut di kelas Thread adalah statis. Memanggil salah satu metode statis melakukan operasi pada utas yang sedang berjalan.

No.Pr. Metode &Deskripsi
1

hasil kekosongan statis publik()

Menyebabkan utas yang sedang berjalan menghasilkan utas lain dengan prioritas yang sama yang menunggu untuk dijadwalkan.

2

tidur kosong statis publik (milidetik panjang)

Menyebabkan utas yang sedang berjalan diblokir setidaknya selama jumlah milidetik yang ditentukan.

3

public static boolean holdingLock(Object x)

Mengembalikan nilai true jika utas saat ini memegang kunci pada Objek yang diberikan.

4

Utas statis publik saat iniThread()

Mengembalikan referensi ke utas yang sedang berjalan, yang merupakan utas yang memanggil metode ini.

5

public static void dumpStack()

Mencetak jejak tumpukan untuk utas yang sedang berjalan, yang berguna saat men-debug aplikasi multiutas.

Contoh

Program ThreadClassDemo berikut menunjukkan beberapa metode kelas Thread ini. Pertimbangkan kelas DisplayMessage yang mengimplementasikan Runnable

// File Name : DisplayMessage.java
// Create a thread to implement Runnable

public class DisplayMessage implements Runnable {
   private String message;
   
   public DisplayMessage(String message) {
      this.message = message;
   }
   
   public void run() {
      while(true) {
         System.out.println(message);
      }
   }
}

Berikut adalah kelas lain yang memperluas kelas Thread

// File Name : GuessANumber.java
// Create a thread to extentd Thread

public class GuessANumber extends Thread {
   private int number;
   public GuessANumber(int number) {
      this.number = number;
   }
   
   public void run() {
      int counter = 0;
      int guess = 0;
      do {
         guess = (int) (Math.random() * 100 + 1);
         System.out.println(this.getName() + " guesses " + guess);
         counter++;
      } while(guess != number);
      System.out.println("** Correct!" + this.getName() + "in" + counter + "guesses.**");
   }
}

Berikut ini adalah program utama, yang menggunakan kelas-kelas yang ditentukan di atas −

// File Name : ThreadClassDemo.java
public class ThreadClassDemo {

   public static void main(String [] args) {
      Runnable hello = new DisplayMessage("Hello");
      Thread thread1 = new Thread(hello);
      thread1.setDaemon(true);
      thread1.setName("hello");
      System.out.println("Starting hello thread...");
      thread1.start();
      
      Runnable bye = new DisplayMessage("Goodbye");
      Thread thread2 = new Thread(bye);
      thread2.setPriority(Thread.MIN_PRIORITY);
      thread2.setDaemon(true);
      System.out.println("Starting goodbye thread...");
      thread2.start();

      System.out.println("Starting thread3...");
      Thread thread3 = new GuessANumber(27);
      thread3.start();
      try {
         thread3.join();
      } catch (InterruptedException e) {
         System.out.println("Thread interrupted.");
      }
      System.out.println("Starting thread4...");
      Thread thread4 = new GuessANumber(75);
      
      thread4.start();
      System.out.println("main() is ending...");
   }
}

Ini akan menghasilkan hasil berikut. Anda dapat mencoba contoh ini lagi dan lagi dan Anda akan mendapatkan hasil yang berbeda setiap saat.

Keluaran

Starting hello thread...
Starting goodbye thread...
Hello
Hello
Hello
Hello
Hello
Hello
Goodbye
Goodbye
Goodbye
Goodbye
Goodbye
.......

Konsep Java Multithreading Utama

Saat melakukan pemrograman Multithreading di Java, Anda harus memiliki konsep-konsep berikut yang sangat berguna


java

  1. Operator Jawa
  2. Komentar Jawa
  3. Java untuk setiap Loop
  4. String Jawa
  5. Antarmuka Jawa
  6. Kelas Anonim Java
  7. Java mencoba-dengan-sumber daya
  8. Anotasi Jawa
  9. Pernyataan Jawa
  10. Vektor Jawa