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

Menguasai Java Multithreading: Pemrograman Konkuren Efisien

Java adalah bahasa pemrograman multi-thread yang berarti kita dapat mengembangkan program multi-thread menggunakan Java. Program multi-thread berisi dua atau lebih bagian yang dapat berjalan secara konkuren dan setiap bagian dapat menangani tugas yang berbeda pada saat yang sama untuk penggunaan optimal sumber daya yang tersedia, terutama ketika komputer Anda memiliki beberapa CPU.

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

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

Siklus Hidup Thread

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

Menguasai Java Multithreading: Pemrograman Konkuren Efisien

Berikut adalah tahap-tahap siklus hidup −

Prioritas Thread

Setiap thread Java memiliki prioritas yang membantu sistem operasi menentukan urutan di mana thread dijadwalkan.

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

Thread dengan prioritas lebih tinggi lebih penting bagi program dan harus dialokasikan waktu processor sebelum thread dengan prioritas lebih rendah. Namun, prioritas thread tidak dapat menjamin urutan di mana thread dieksekusi dan sangat bergantung pada platform.

Membuat Thread dengan Menerapkan Antarmuka Runnable

Jika kelas Anda dimaksudkan untuk dieksekusi sebagai thread, Anda dapat mencapai ini dengan menerapkan antarmuka Runnable. Anda perlu mengikuti tiga langkah dasar −

Langkah 1

Sebagai langkah pertama, Anda perlu menerapkan metode run() yang disediakan oleh antarmuka Runnable. Metode ini memberikan titik entri untuk thread dan Anda akan menaruh logika bisnis lengkap Anda di dalam metode ini. Berikut adalah sintaks sederhana dari metode run() −

 public void run( ) 

Langkah 2

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

 Thread(Runnable threadObj, String threadName); 

Di mana, threadObj adalah instance dari kelas yang menerapkan antarmuka Runnable dan threadName adalah nama yang diberikan kepada thread baru.

Langkah 3

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

 void start(); 

Contoh

Berikut adalah contoh yang membuat thread baru dan memulai untuk berjalan −

Live Demo
 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 −

Output

 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. 

Membuat Thread dengan Memperluas Kelas Thread

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

Langkah 1

Anda perlu mengganti metode run( ) yang tersedia dalam kelas Thread. Metode ini memberikan titik entri untuk thread dan Anda akan menaruh logika bisnis lengkap Anda di dalam metode ini. Berikut adalah sintaks sederhana dari metode run() −

 public void run( ) 

Langkah 2

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

 void start( ); 

Contoh

Berikut adalah program sebelumnya yang ditulis ulang untuk memperluas Thread −

Live Demo
 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 −

Output

 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 Thread

Berikut adalah daftar metode penting yang tersedia dalam kelas Thread.

Sr.No. Metode & Deskripsi
1

public void start()

Memulai thread dalam jalur eksekusi terpisah, kemudian memanggil metode run() pada objek Thread ini.

2

public void run()

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

3

public final void setName(String name)

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

4

public final void setPriority(int priority)

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

5

public final void setDaemon(boolean on)

Parameter true menunjukkan bahwa Thread ini adalah thread daemon.

6

public final void join(long millisec)

Thread saat ini memanggil metode ini pada thread kedua, menyebabkan thread saat ini memblokir sampai thread kedua berhenti atau jumlah milidetik yang ditentukan berlalu.

7

public void interrupt()

Mengganggu thread ini, menyebabkan melanjutkan eksekusi jika sebelumnya diblokir karena alasan apa pun.

8

public final boolean isAlive()

Mengembalikan true jika thread masih hidup, yaitu kapan saja setelah thread dimulai tetapi sebelum berjalan hingga selesai.

Metode sebelumnya dipanggil pada objek Thread tertentu. Metode berikut dalam kelas Thread adalah statis. Memanggil salah satu metode statis melakukan operasi pada thread yang sedang berjalan saat ini.

Sr.No. Metode & Deskripsi
1

public static void yield()

Membuat thread yang sedang berjalan memberikan jalan kepada thread lain dengan prioritas yang sama yang menunggu untuk dijadwalkan.

2

public static void sleep(long millisec)

Membuat thread yang sedang berjalan memblokir setidaknya untuk jumlah milidetik yang ditentukan.

3

public static boolean holdsLock(Object x)

Mengembalikan true jika thread saat ini memiliki kunci pada Objek yang diberikan.

4

public static Thread currentThread()

Mengembalikan referensi ke thread yang sedang berjalan, yaitu thread yang memanggil metode ini.

5

public static void dumpStack()

Mencetak stack trace untuk thread yang sedang berjalan, yang berg saat melakukan debug aplikasi multi-thread.

Contoh

Program ThreadClassDemo berikut menunjukkan beberapa metode dari kelas Thread ini. Pertimbangkan kelas DisplayMessage yang menerapkan 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 adalah program utama, yang menggunakan kelas-kelas yang didefinisikan 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 berulang kali dan Anda akan mendapatkan hasil yang berbeda setiap kali.

Output

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

Konsep Utama Java Multithreading

Saat melakukan pemrograman Multi-threading di Java, Anda perlu memiliki konsep berikut yang sangat jelas −


java

  1. Menguasai Operator Java: Tipe, Sintaks, & Contoh Praktis
  2. Komentar Java: Tipe, Penggunaan, dan Best Practices
  3. Menguasai Java Enhanced For Loop: Sintaks, Contoh, dan Best Practices
  4. Menguasai String Java: Pembuatan, Metode, dan Best Practices
  5. Menguasai Antarmuka Java: Konsep, Implementasi, dan Praktik Terbaik
  6. Menguasai Kelas Dalam Anonim Java: Definisi, Sintaks, dan Contoh Praktis
  7. Menguasai Java Try-with-Resources: Manajemen Sumber Daya Otomatis Dijelaskan
  8. Anotasi Java Dijelaskan: Jenis, Penempatan, dan Contoh Praktis
  9. Pernyataan Java: Panduan Praktis untuk Mendeteksi Bug dan Memastikan Keandalan Kode
  10. Memahami Java Vector: Penggunaan, Fitur, dan Perbandingan dengan ArrayList