Tutorial Multithreading di Java dengan Program &Contoh
Aplikasi apapun dapat memiliki banyak proses (instance). Masing-masing proses ini dapat ditetapkan sebagai satu utas atau beberapa utas. Kita akan melihat dalam tutorial ini bagaimana melakukan banyak tugas secara bersamaan dan juga mempelajari lebih lanjut tentang utas dan sinkronisasi antar utas.
Dalam tutorial Multithreading di Java ini, kita akan belajar:
Apa itu Utas Tunggal
Apa itu Multithreading di Java?
Siklus Hidup Thread di Java
Sinkronisasi Utas Java
Contoh Multithreading Java
Apa itu Utas Tunggal?
Satu utas di Java pada dasarnya adalah unit pemrosesan yang ringan dan terkecil. Java menggunakan utas dengan menggunakan "Kelas Utas".
Ada dua jenis utas – utas pengguna dan utas daemon (utas daemon digunakan saat kita ingin membersihkan aplikasi dan digunakan di latar belakang).
Saat aplikasi pertama kali dimulai, utas pengguna dibuat. Posting itu, kita bisa membuat banyak user thread dan daemon thread.
Contoh Utas Tunggal:
package demotest;
public class GuruThread
{
public static void main(String[] args) {
System.out.println("Single Thread");
}
}
Keuntungan utas tunggal:
Mengurangi overhead dalam aplikasi saat utas tunggal dijalankan di sistem
Selain itu, ini mengurangi biaya pemeliharaan aplikasi.
Apa itu Multithreading di Java?
Multi-utas di Jawa adalah proses mengeksekusi dua atau lebih utas secara bersamaan untuk pemanfaatan CPU secara maksimal. Aplikasi multithreaded mengeksekusi dua atau lebih thread yang dijalankan secara bersamaan. Oleh karena itu, ini juga dikenal sebagai Concurrency di Jawa. Setiap utas berjalan sejajar satu sama lain. Beberapa utas tidak mengalokasikan area memori terpisah, sehingga menghemat memori. Selain itu, peralihan konteks antar utas membutuhkan waktu lebih sedikit.
Contoh Multi-utas:
package demotest;
public class GuruThread1 implements Runnable
{
public static void main(String[] args) {
Thread guruThread1 = new Thread("Guru1");
Thread guruThread2 = new Thread("Guru2");
guruThread1.start();
guruThread2.start();
System.out.println("Thread names are following:");
System.out.println(guruThread1.getName());
System.out.println(guruThread2.getName());
}
@Override
public void run() {
}
}
Keuntungan multiutas:
Pengguna tidak diblokir karena utasnya independen, dan kami dapat melakukan beberapa operasi sekaligus
Karena utasnya independen, utas lainnya tidak akan terpengaruh jika satu utas memenuhi pengecualian.
Siklus Hidup Thread di Java
Siklus Hidup utas:
Siklus Hidup Utas di Java
Ada berbagai tahapan siklus hidup thread seperti yang ditunjukkan pada diagram di atas:
Baru
Dapat dijalankan
Berlari
Menunggu
Mati
Baru: Pada fase ini, utas dibuat menggunakan kelas “Kelas utas”. Tetap dalam status ini hingga program dimulai benang. Ini juga dikenal sebagai utas lahir.
Dapat dijalankan: Di halaman ini, instance dari thread dipanggil dengan metode start. Kontrol utas diberikan kepada penjadwal untuk menyelesaikan eksekusi. Itu tergantung pada penjadwal, apakah akan menjalankan utas.
Berlari: Ketika utas mulai dieksekusi, maka status diubah menjadi status "berjalan". Penjadwal memilih satu utas dari kumpulan utas, dan mulai dijalankan di aplikasi.
Menunggu: Ini adalah keadaan ketika sebuah utas harus menunggu. Karena ada banyak utas yang berjalan di aplikasi, ada kebutuhan untuk sinkronisasi antar utas. Oleh karena itu, satu utas harus menunggu, sampai utas lainnya dieksekusi. Oleh karena itu, keadaan ini disebut sebagai keadaan menunggu.
Mati: Ini adalah keadaan ketika utas dihentikan. Utas dalam keadaan berjalan dan segera setelah selesai diproses, utas dalam keadaan "mati".
Beberapa metode thread yang umum digunakan adalah:
Metode
Deskripsi
start()
Metode ini memulai eksekusi thread dan JVM memanggil metode run() pada thread.
Tidur(int milidetik)
Metode ini membuat utas tidur sehingga eksekusi utas akan berhenti selama milidetik yang disediakan dan setelah itu, utas mulai dieksekusi lagi. Ini membantu dalam sinkronisasi utas.
getName()
Ini mengembalikan nama utas.
setPriority(int newpriority)
Ini mengubah prioritas utas.
hasil ()
Ini menyebabkan utas saat ini berhenti dan utas lainnya dieksekusi.
Contoh: Dalam contoh program multithreading di Java ini, kita akan membuat thread dan menjelajahi metode bawaan yang tersedia untuk thread.
package demotest;
public class thread_example1 implements Runnable {
@Override
public void run() {
}
public static void main(String[] args) {
Thread guruthread1 = new Thread();
guruthread1.start();
try {
guruthread1.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
guruthread1.setPriority(1);
int gurupriority = guruthread1.getPriority();
System.out.println(gurupriority);
System.out.println("Thread Running");
}
}
Penjelasan kode:
Baris Kode 2: Kami sedang membuat kelas “thread_Example1” yang mengimplementasikan antarmuka Runnable (itu harus diimplementasikan oleh kelas mana pun yang instance-nya dimaksudkan untuk dieksekusi oleh utas.)
Baris Kode 4: Ini menimpa metode run dari antarmuka runnable karena wajib untuk menimpa metode itu
Baris Kode 6: Di sini kita telah mendefinisikan metode utama di mana kita akan memulai eksekusi thread.
Baris Kode 7 Di sini kita membuat nama utas baru sebagai "guruthread1" dengan membuat instance kelas utas baru.
Baris Kode 8: kita akan menggunakan metode "mulai" dari utas menggunakan instance "guruthread1". Di sini utas akan mulai dijalankan.
Baris Kode 10: Di sini kita menggunakan metode "tidur" dari utas menggunakan instance "guruthread1". Oleh karena itu, utas akan tidur selama 1000 milidetik.
Kode 9-14: Di sini kami telah menempatkan metode tidur di blok coba tangkap karena ada pengecualian yang diperiksa yang terjadi yaitu pengecualian yang terputus.
Baris Kode 15: Di sini kami menyetel prioritas utas ke 1 dari prioritas mana pun
Baris Kode 16: Di sini kita mendapatkan prioritas utas menggunakan getPriority()
Baris Kode 17: Di sini kami mencetak nilai yang diambil dari getPriority
Baris Kode 18: Di sini kami menulis teks yang sedang dijalankan oleh utas.
Ketika Anda mengeksekusi kode di atas, Anda mendapatkan output berikut:
Keluaran:
5 adalah prioritas Thread, dan Thread Running adalah teks yang merupakan output dari kode kita.
Sinkronisasi Utas Java
Dalam multithreading, ada perilaku program yang tidak sinkron. Jika satu utas sedang menulis beberapa data dan utas lain yang membaca data pada saat yang sama, dapat menyebabkan inkonsistensi dalam aplikasi.
Ketika ada kebutuhan untuk mengakses sumber daya bersama oleh dua atau lebih utas, maka pendekatan sinkronisasi digunakan.
Java telah menyediakan metode tersinkronisasi untuk mengimplementasikan perilaku tersinkronisasi.
Dalam pendekatan ini, setelah utas mencapai di dalam blok yang disinkronkan, maka tidak ada utas lain yang dapat memanggil metode itu pada objek yang sama. Semua utas harus menunggu sampai utas itu menyelesaikan blok yang disinkronkan dan keluar dari sana.
Dengan cara ini, sinkronisasi membantu dalam aplikasi multithread. Satu utas harus menunggu sampai utas lainnya menyelesaikan eksekusinya baru kemudian utas lainnya diizinkan untuk dieksekusi.
Itu dapat ditulis dalam bentuk berikut:
Synchronized(object)
{
//Block of statements to be synchronized
}
Contoh Multithreading Java
Dalam contoh Java multithreading ini, kami akan mengambil dua utas dan mengambil nama utas.
Contoh1:
GuruThread1.java
package demotest;
public class GuruThread1 implements Runnable{
/**
* @param args
*/
public static void main(String[] args) {
Thread guruThread1 = new Thread("Guru1");
Thread guruThread2 = new Thread("Guru2");
guruThread1.start();
guruThread2.start();
System.out.println("Thread names are following:");
System.out.println(guruThread1.getName());
System.out.println(guruThread2.getName());
}
@Override
public void run() {
}
}
Penjelasan kode:
Baris Kode 3: Kami telah mengambil kelas "GuruThread1" yang mengimplementasikan Runnable (itu harus diimplementasikan oleh kelas mana pun yang instancenya dimaksudkan untuk dieksekusi oleh utas.)
Baris Kode 8: Ini adalah metode utama kelas
Baris Kode 9: Di sini kita membuat instance kelas Thread dan membuat instance bernama "guruThread1" dan membuat thread.
Baris Kode 10: Di sini kita membuat instance kelas Thread dan membuat instance bernama "guruThread2" dan membuat thread.
Baris Kode 11 Kami memulai utas yaitu guruThread1.
Baris Kode 12: Kami memulai utas yaitu guruThread2.
Baris Kode 13: Mengeluarkan teks sebagai “Nama utas mengikuti:”
Baris Kode 14: Mendapatkan nama utas 1 menggunakan metode getName() dari kelas utas.
Baris Kode 15: Mendapatkan nama utas 2 menggunakan metode getName() dari kelas utas.
Ketika Anda mengeksekusi kode di atas, Anda mendapatkan output berikut:
Keluaran:
Nama utas ditampilkan di sini sebagai
Guru1
Guru2
Contoh 2:
Dalam contoh multithreading di Java ini, kita akan belajar tentang mengganti metode run() dan start() metode dari antarmuka runnable dan membuat dua utas dari kelas itu dan menjalankannya sesuai dengan itu.
Juga, kami mengambil dua kelas,
Yang akan mengimplementasikan antarmuka yang dapat dijalankan dan
Satu lagi yang akan memiliki metode utama dan dijalankan sesuai dengan itu.
package demotest;
public class GuruThread2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
GuruThread3 threadguru1 = new GuruThread3("guru1");
threadguru1.start();
GuruThread3 threadguru2 = new GuruThread3("guru2");
threadguru2.start();
}
}
class GuruThread3 implements Runnable {
Thread guruthread;
private String guruname;
GuruThread3(String name) {
guruname = name;
}
@Override
public void run() {
System.out.println("Thread running" + guruname);
for (int i = 0; i < 4; i++) {
System.out.println(i);
System.out.println(guruname);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Thread has been interrupted");
}
}
}
public void start() {
System.out.println("Thread started");
if (guruthread == null) {
guruthread = new Thread(this, guruname);
guruthread.start();
}
}
}
Penjelasan kode:
Baris Kode 2: Di sini kita mengambil kelas “GuruThread2” yang akan memiliki metode utama di dalamnya.
Baris Kode 4: Di sini kita mengambil metode utama kelas.
Baris Kode 6-7: Di sini kita membuat instance kelas GuruThread3 (yang dibuat di baris kode di bawah ini) sebagai "threadguru1" dan kita memulai thread.
Baris Kode 8-9: Di sini kita membuat instance lain dari kelas GuruThread3 (yang dibuat di bawah baris kode) sebagai "threadguru2" dan kita memulai thread.
Baris Kode 11 Di sini kita membuat kelas "GuruThread3" yang mengimplementasikan antarmuka runnable (itu harus diimplementasikan oleh kelas mana pun yang instancenya dimaksudkan untuk dieksekusi oleh utas.)
Baris Kode 13-14: kita mengambil dua variabel kelas dari mana yang satu bertipe kelas utas dan yang lainnya dari kelas string.
Baris Kode 15-18: kami mengganti konstruktor GuruThread3, yang mengambil satu argumen sebagai tipe string (yaitu nama utas) yang ditugaskan ke nama guru variabel kelas dan karenanya nama utas disimpan.
Baris Kode 20: Di sini kita mengganti metode run() dari antarmuka yang dapat dijalankan.
Baris Kode 21: Kami mengeluarkan nama utas menggunakan pernyataan println.
Baris Kode 22-31: Di sini kita menggunakan for loop dengan counter diinisialisasi ke 0, dan tidak boleh kurang dari 4 (kita dapat mengambil nomor apapun maka di sini loop akan berjalan 4 kali) dan menambah counter. Kami mencetak nama utas dan juga membuat utas tidur selama 1000 milidetik dalam blok coba-tangkap karena metode tidur memunculkan pengecualian yang dicentang.
Baris Kode 33: Di sini kita mengganti metode awal dari antarmuka yang dapat dijalankan.
Baris Kode 35: Kami mengeluarkan teks "Utas dimulai".
Baris Kode 36-40: Di sini kita mengambil kondisi if untuk memeriksa apakah variabel kelas guruthread memiliki nilai di dalamnya atau tidak. Jika itu nol maka kami membuat instance menggunakan kelas utas yang mengambil nama sebagai parameter (nilai yang ditetapkan dalam konstruktor). Setelah itu, utas dimulai menggunakan metode start().
Ketika Anda menjalankan kode di atas, Anda mendapatkan output berikut:
Keluaran :
Ada dua utas karenanya, kami mendapat dua kali pesan "Utas dimulai".
Kami mendapatkan nama utas seperti yang telah kami keluarkan.
Itu masuk ke loop for di mana kita mencetak penghitung dan nama utas dan penghitung dimulai dengan 0.
Loop dijalankan tiga kali dan di antara utas ditidurkan selama 1000 milidetik.
Oleh karena itu, pertama, kita mendapatkan guru1 lalu guru2 lalu guru2 lagi karena utas tidur di sini selama 1000 milidetik dan kemudian guru1 berikutnya dan lagi guru1, utas tidur selama 1000 milidetik, jadi kita mendapatkan guru2 dan kemudian guru1.
Ringkasan
Dalam tutorial ini, kita melihat aplikasi multithreaded di Java dan cara menggunakan single dan multithread di Java.
Menjelaskan multithreading di Java:dalam multithreading, pengguna tidak diblokir karena thread bersifat independen dan dapat melakukan beberapa operasi sekaligus
Berbagai tahapan siklus hidup thread,
Baru
Dapat dijalankan
Berlari
Menunggu
Mati
Kami juga belajar tentang sinkronisasi antar thread, yang membantu aplikasi berjalan dengan lancar.
Pemrograman multithread di Java membuat lebih banyak tugas aplikasi menjadi lebih mudah.