Section Artikel
Java adalah bahasa pemrograman multi-threaded yang artinya 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 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 yang umum seperti CPU. Multi-threading memperluas gagasan multitasking menjadi aplikasi di mana Anda dapat membagi operasi tertentu dalam satu aplikasi menjadi utas 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 menulis dengan cara di mana banyak aktivitas dapat dilanjutkan secara bersamaan dalam program yang sama.
Multithreading di Java adalah proses menjalankan beberapa utas secara bersamaan. Thread adalah sub-proses ringan, unit pemrosesan terkecil. Multiprocessing dan multithreading, keduanya digunakan untuk mencapai multitasking. Namun, kami menggunakan multithreading daripada multiprocessing karena utas menggunakan area memori bersama. Mereka tidak mengalokasikan area memori terpisah sehingga menghemat memori, dan peralihan konteks antar utas membutuhkan waktu lebih sedikit daripada proses. Java Multithreading banyak digunakan dalam permainan, animasi.
Multitasking adalah proses menjalankan banyak tugas secara bersamaan. Kami menggunakan multitasking untuk memanfaatkan CPU. Multitasking dapat dicapai dengan dua cara:
Thread adalah subproses ringan, unit pemrosesan terkecil. Ini adalah jalur eksekusi yang terpisah. Thread sangat independen. Jika terjadi pengecualian di satu Thread, itu tidak memengaruhi Thread lainnya. Ini menggunakan area memori bersama.
Seperti yang ditunjukkan pada gambar di atas, Thread dijalankan di dalam proses. Ada peralihan konteks di antara Thread. Mungkin ada banyak proses di dalam OS, dan satu proses dapat memiliki banyak Thread.
Java menyediakan kelas Thread untuk mencapai pemrograman thread. Kelas thread menyediakan konstruktor dan metode untuk membuat dan melakukan operasi pada thread. Kelas thread memperluas kelas Object dan mengimplementasikan antarmuka Runnable.
Sebuah Thread melewati berbagai tahapan dalam siklus hidupnya. Misalnya, thread lahir, dimulai, dijalankan, lalu mati.Bisa berada di salah satu dari lima status. Menurut sun, hanya ada 4 status dalam siklus hidup thread di java baru, dapat dijalankan, tidak dapat dijalankan, dan dihentikan. Tidak ada status berjalan. Tetapi untuk lebih memahami utasnya, kami menjelaskannya di 5 negara bagian.
Siklus hidup utas di java dikendalikan oleh JVM. Status thread java adalah sebagai berikut
Setiap thread Java memiliki prioritas yang membantu sistem operasi menentukan urutan thread 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 program dan harus dialokasikan waktu prosesor sebelum utas dengan prioritas lebih rendah. Namun, prioritas thread tidak dapat menjamin urutan eksekusi thread dan sangat bergantung pada platform.
Ada dua cara untuk membuat thread yaitu dengan cara berikut
Kelas thread menyediakan konstruktor dan metode untuk membuat dan melakukan operasi pada thread. Kelas thread memperluas kelas Objek dan mengimplementasikan antarmuka Runnable. Cara pertama membuat thread adalah membuat kelas baru yang memperluas kelas Thread menggunakan dua langkah sederhana berikut. Pendekatan ini memberikan lebih banyak fleksibilitas dalam menangani beberapa thread yang dibuat menggunakan metode yang tersedia di kelas Thread.
Langkah Pertama
Anda perlu mengganti metode run () 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 () yaitu
public void run( )
Langkah Kedua
Setelah objek Thread dibuat, Anda bisa memulainya dengan memanggil metode start (), yang menjalankan metode panggilan ke run (). Berikut ini adalah sintaks sederhana dari metode start () dapat kita lihat pada kode berikut
void start( );
Berikut adalah program sebelumnya yang ditulis ulang untuk memperpanjang Thread
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(); } }
Maka akan menghasilkan output berikut ini
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.
Berikut ini 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.**"); } }
Contoh Lain pada Memperluas Kelas Thread yaitu
class Multi extends Thread{ public void run(){ System.out.println("thread is running..."); } public static void main(String args[]){ Multi t1=new Multi(); t1.start(); } } //output yang dihasilkan yaitu : Output:thread is running...
Jika kelas Anda dimaksudkan untuk dieksekusi sebagai thread, Anda dapat melakukannya dengan mengimplementasikan Runnable Interfaces. Anda harus mengikuti tiga langkah dasar yaitu
Langkah Pertama
Sebagai langkah pertama, Anda perlu mengimplementasikan metode run () yang disediakan oleh antarmuka Runnable. 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 Kedua
Sebagai langkah kedua, Anda akan membuat instance objek Thread menggunakan konstruktor berikut
Thread(Runnable threadObj, String threadName);
Di mana, threadObj adalah turunan dari kelas yang mengimplementasikan antarmuka Runnable dan threadName adalah nama yang diberikan ke utas baru.
Langkah Ketiga
Setelah objek Thread dibuat, Anda bisa memulainya dengan memanggil metode start (), yang menjalankan metode panggilan ke run (). Berikut ini adalah sintaks sederhana dari metode start ()
void start();
Berikut adalah contoh untuk membuat utas baru dan mulai menjalankannya. Contoh nya adalah pada kode berikut
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(); } }
Maka output yang dihasilkan akan menjadi seperti ini
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.
Contoh Berikutnya adalah dengan menuliskan kode berikut Program ThreadClassDemo berikut mendemonstrasikan 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); } } }
Kemudian kita dapat membuat contoh kode lainnya seperti dibawah ini
class Multi3 implements Runnable{ public void run(){ System.out.println("thread is running..."); } public static void main(String args[]){ Multi3 m1=new Multi3(); Thread t1 =new Thread(m1); t1.start(); } } // maka akan menghasilkan output : Output:thread is running...
Selanjutnya adalah kita buat sebuah gabungan dari 2 metode diatas yaitu
// 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 sebagai berikut. Anda dapat mencoba contoh ini lagi dan lagi dan Anda akan mendapatkan hasil yang berbeda setiap saat
Starting hello thread...
Starting goodbye thread...
Hello
Hello
Hello
Hello
Hello
Hello
Goodbye
Goodbye
Goodbye
Goodbye
Goodbye
.......
Jika Anda tidak memperluas kelas Thread, objek kelas Anda tidak akan diperlakukan sebagai objek thread. Jadi, Anda perlu membuat objek kelas Thread secara eksplisit. Kami meneruskan objek kelas Anda yang mengimplementasikan Runnable sehingga metode run () kelas Anda dapat mengeksekusi.