Java Concurrency - Gambaran Umum
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.
Siklus Hidup Thread
Seutas benang melewati berbagai tahapan dalam siklus hidupnya. Misalnya, utas lahir, dimulai, dijalankan, lalu mati. Diagram berikut menunjukkan siklus hidup utas lengkap.
Berikut adalah tahapan siklus hidup -
New- Utas baru memulai siklus hidupnya di status baru. Ini tetap dalam status ini sampai program memulai utas. Ini juga disebut sebagai aborn thread.
Runnable- Setelah utas yang baru lahir dimulai, utas menjadi dapat dijalankan. Untaian dalam status ini dianggap sedang menjalankan tugasnya.
Waiting- Terkadang, thread bertransisi ke status menunggu sementara thread menunggu thread lain untuk melakukan tugas. Sebuah thread bertransisi kembali ke kondisi runnable hanya ketika thread lain memberi sinyal kepada thread yang menunggu untuk melanjutkan eksekusi.
Timed Waiting- Utas yang dapat dijalankan dapat memasuki status tunggu berjangka waktu untuk interval waktu tertentu. Sebuah utas dalam keadaan ini transisi kembali ke keadaan runnable ketika interval waktu itu berakhir atau ketika peristiwa yang menunggu terjadi.
Terminated (Dead) - Utas yang dapat dijalankan memasuki status dihentikan saat menyelesaikan tugasnya atau sebaliknya.
Prioritas Benang
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.
Buat Thread dengan Menerapkan Antarmuka yang Dapat Dijalankan
Jika kelas Anda dimaksudkan untuk dieksekusi sebagai utas, Anda dapat melakukannya dengan mengimplementasikan Runnableantarmuka. Anda harus mengikuti tiga langkah dasar -
Langkah 1
Sebagai langkah pertama, Anda perlu mengimplementasikan metode run () yang disediakan oleh a Runnableantarmuka. 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 Thread objek menggunakan konstruktor berikut -
Thread(Runnable threadObj, String threadName);
Di mana, threadObj adalah turunan dari kelas yang mengimplementasikanRunnable antarmuka dan threadName adalah nama yang diberikan ke 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();
Example
Berikut adalah contoh untuk membuat utas baru dan mulai menjalankannya -
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 sebagai 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.
Buat Thread dengan Memperluas Kelas Thread
Cara kedua untuk membuat utas adalah membuat kelas baru yang diperluas Threadkelas 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 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( );
Example
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();
}
}
Ini akan menghasilkan hasil sebagai 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.