37 Contoh Soal Pemrograman Java Pertanyaan + Jawaban Super lengkap!

37 Contah Soal Pemrograman Java Pertanyaan + Jawaban Super lengkap!

11. Bagaimana cara membuat thread daemon?

Thread daemon adalah benang yang menyediakan layanan kepada benang lain dan secara otomatis berakhir ketika semua benang non-daemon berakhir. Sebagai contoh, pengumpul sampah adalah sebuah thread daemon.

Untuk membuat thread daemon, Anda bisa menggunakan metode setDaemon(true) dari kelas Thread untuk menetapkan thread biasa sebagai daemon. Metode ini harus dipanggil sebelum metode start() dipanggil, jika tidak, IllegalThreadStateException akan dilemparkan. Setelah thread mulai berjalan, Anda tidak dapat mengubah status penjaganya.

Contoh kodenya adalah sebagai berikut:

// Membuat sebuah thread normal
Thread t = new Thread(new Runnable() {    

@Override    
public void run() {        

// do something    
}});

// Tetapkan sebagai thread daemon
t.setDaemon(true);

// Memulai thread
t.start();

12. Apa yang dimaksud dengan kelas Java Timer?

Bagaimana cara membuat tugas dengan interval waktu tertentu?

Timer adalah kelas utilitas yang dapat digunakan untuk menjadwalkan sebuah thread untuk melakukan sebuah tugas pada waktu tertentu di masa depan atau pada interval tertentu. Kelas Timer dapat digunakan untuk menjadwalkan tugas satu kali atau tugas yang berulang.

Read More

Kita perlu mewarisi kelas ini dan menimpa metode run () untuk membuat tugas pengatur waktu kita sendiri dan menggunakan metode schedule () atau scheduleAtFixedRate () dari Timer untuk menjadwalkan eksekusinya. Terdapat framework Quartz open source yang dapat digunakan untuk membuat tugas berjangka waktu yang lebih kompleks dan fleksibel.

Untuk membuat task dengan interval waktu tertentu, kita dapat menggunakan langkah-langkah berikut:

  • Buat objek Timer dengan opsi untuk mengaturnya sebagai daemon thread atau tidak.
  • Buat objek TimerTask, dengan mewarisi kelas TimerTask dan menimpa metode run () untuk mendefinisikan logika tugas yang akan dieksekusi.
  • Panggil metode schedule () atau scheduleAtFixedRate () dari objek Timer, dengan mengoper objek TimerTask, tentukan waktu eksekusi pertama dan interval waktu.

Sebagai contoh, kode berikut ini membuat tugas yang mencetak waktu saat ini setiap 5 detik dan mulai dieksekusi setelah 3 detik:

import java.util.Timer;import java.util.TimerTask;import java.text.SimpleDateFormat;import java.util.Date;public class TestTimer {    public static void main (String [] args) {        

// Buat objek Timer dan atur sebagai thread daemon          
Timer timer = new Timer (true);        

// Membuat objek TimerTask.Mewarisi kelas TimerTask dan menimpa metode run ()       
TimerTask task = new TimerTask () {            
@Override            
public void run () {                

// Tentukan logika tugas yang akan dijalankan, dalam hal ini mencetak waktu saat ini.                  
SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");                System.out.println ("Waktu saat ini:" + sdf.format (new Date ()));            }        
};        

// Panggil metodeschedule (), dengan mengoper objek TimerTask, menentukan waktu eksekusi pertama dan interval       
timer.schedule (task, 3000, 5000);    
}}

13. Perbedaan antara metode interrupt dan isInterrupted di Java?

Metode interrupt(), interrupted(), dan isInterrupted() di Java adalah alat untuk interupsi thread. Ketiganya memiliki kegunaan yang berbeda saat menangani interupsi thread.

  • interrupt (): Ini adalah metode instance, yang digunakan untuk menginterupsi thread. Ketika kita memanggil metode interrupt () dari sebuah thread. Ini akan mengeset flag interupsi dari thread tersebut menjadi true. selain itu, jika thread berada dalam sleep (), wait (), join () dan operasi lain yang akan menyebabkan thread tersebut diblok. Maka InterruptedException akan dilemparkan, dan status interupsi akan dihapus (yaitu, di-set ke false).
  • interrupted (): Ini adalah metode statis, terutama digunakan untuk mendeteksi apakah thread saat ini terputus. Metode ini akan mengembalikan bit flag interupsi dari thread yang sedang berjalan, dan akan mengosongkan bit flag interupsi (dengan kata lain, diset menjadi false). Ini adalah metode statis. Jadi biasanya digunakan di thread yang sedang berjalan untuk memeriksa apakah thread yang sedang berjalan diinterupsi.
  • isInterrupted(): Ini adalah metode instance, digunakan untuk mendeteksi apakah thread sedang diinterupsi. Tidak seperti interrupted(), metode ini tidak mengubah bit flag interupsi thread. Metode ini dapat digunakan jika, misalnya, Anda hanya ingin memeriksa status interupsi tanpa mengubahnya.

Ketiga metode ini umumnya digunakan untuk menangani interupsi thread. Metode-metode ini dapat digunakan ketika menangani thread yang harus berjalan dalam jangka waktu yang lama, atau ketika diperlukan untuk menyediakan cara agar operasi thread dapat dibatalkan.

Contoh berikut ini membuat sebuah thread dan menggunakan metode interrupt(), interrupted(), dan isInterrupted().

public class Main {    
public static void main(String[] args) {        
Thread thread = new Thread(() -> {            

//Coba jalankan selama 5 detik      
for (int i = 0; i < 5; i++) {                
System.out.println("Thread running for " + (i + 1) + " seconds"); 
try {                    
Thread.sleep(1000);                

} catch (InterruptedException e) {                    System.out.println("Thread was interrupted during sleep.");                    

// Setelah menangkap InterruptedException, Anda perlu melakukan interupsi secara manual karena menangkap InterruptedException akan menghapus bit flag interupsi                   
Thread.currentThread().interrupt();                
}                

// Periksa apakah terputus             
if (Thread.interrupted()) {                    
System.out.println("Thread was interrupted. Exiting gracefully");                 
return;                
}            
}        
});        
thread.start();        

// Biarkan thread utama tidur selama 2 detik untuk memastikan thread baru dapat berjalan.    
try {            
Thread.sleep(2000);        
} catch (InterruptedException e) {            
e.printStackTrace();        
}        

// Menginterupsi thread    
System.out.println("About to interrupt thread.");        
thread.interrupt();        

// Periksa apakah thread terputus      
System.out.println("Is thread interrupted? : " + thread.isInterrupted());    }}

Pada contoh ini, pertama-tama kita membuat sebuah thread dan menjalankannya. Kemudian kita mengistirahatkan (sleep() thread utama selama 2 detik untuk memastikan thread baru memiliki kesempatan untuk mulai berjalan. Lalu kita memanggil interrupt() untuk menginterupsi thread baru tersebut. Terakhir, kita menggunakan isInterrupted() untuk mengecek apakah thread baru diinterupsi.

Pada thread baru, kita menggunakan sleep() untuk mensimulasikan operasi yang membutuhkan waktu. Kemudian kita menangkap InterruptedException dan mencetak sebuah pesan. Kita kemudian menggunakan interrupted() untuk memeriksa apakah thread diinterupsi. Jika iya, kita keluar dari thread tersebut.

14. Apa perbedaan antara metode submit() dan execute() di dalam thread pool Java?

Kedua metode tersebut dapat mengirimkan tugas ke thread pool, tetapi ada beberapa perbedaan di antara keduanya, sebagai berikut:

  • Perbedaan parameter metode: parameter metode execute() adalah tugas yang mengimplementasikan antarmuka Runnable. Sedangkan parameter metode submit() dapat berupa kelas implementasi dari antarmuka Runnable atau antarmuka Callable, yang dapat mengembalikan hasil eksekusi. Sedangkan antarmuka Runnable tidak dapat.
  • Perbedaan dalam nilai kembalian metode: metode execute() tidak memiliki nilai kembalian, sedangkan metode submit() memiliki nilai kembalian dan mengembalikan objek Future, yang dapat digunakan untuk mendapatkan hasil eksekusi tugas.
  • Perbedaan dalam penanganan pengecualian: metode execute() melempar pengecualian secara langsung ketika pengecualian terjadi dalam eksekusi tugas. Sedangkan metode submit() menangkap pengecualian dan merangkumnya dalam objek Future. Kita bisa mendapatkan pengecualian selama eksekusi dengan memanggil metode get() dari objek Future.
  • Dampaknya pada thread pool berbeda: metode execute() mengirimkan tugas ke thread pool. Jika thread pool penuh, maka akan langsung melempar RejectedExecutionException. metode submit() mengirimkan tugas ke thread pool. Jika thread pool penuh, maka akan memasukkan tugas ke dalam antrian pemblokiran, menunggu thread yang kosong sebelum eksekusi.

Singkatnya, kedua metode tersebut dapat diterapkan pada skenario yang berbeda. Kita perlu memilih metode mana yang akan digunakan sesuai dengan kebutuhan masing-masing. Jika Anda perlu mendapatkan hasil eksekusi atau perlu menangkap eksepsi dalam proses eksekusi. Gunakan metode submit(), jika tidak, Anda dapat menggunakan metode execute(). Pada saat yang sama, Anda perlu memperhatikan ukuran antrian pemblokiran thread pool untuk mencegah tugas-tugas hilang karena antrian penuh.

Beberapa contoh kode untuk menunjukkan perbedaan antara submit() dan execute():

// Membuat thread pool
ExecutorService pool = Executors.newFixedThreadPool(2);

// Membuat Runnable
Runnable runnable = new Runnable() 
{    
@Override    public void run() {        
System.out.println("Runnable任务执行中...");        
try {            
Thread.sleep(1000); 

// Mensimulasikan operasi yang memakan waktu      
} catch (InterruptedException e) {            
e.printStackTrace();        
}        
System.out.println("Runnable Akhir pelaksanaan perintah");    
}};

// Membuat Callable yang Dapat Dipanggil
Callable<Integer> 
callable = new Callable<Integer>() {    
@Override    public Integer call() throws Exception {        System.out.println("Callable Tugas yang sedang berjalan...");        
try {            
Thread.sleep(1000); 

// Mensimulasikan operasi yang memakan waktu     
} catch (InterruptedException e) {            
e.printStackTrace();        
}        
System.out.println("Callable Akhir pelaksanaan perintah");        
return 1 + 1; 

/ Mengembalikan hasil perhitungan  
}};

// Mengirimkan tugas yang dapat Runnable menggunakan metode execute tanpa nilai balik
pool.execute(runnable);

// Mengirimkan tugas yang dapat Runnable menggunakan metode submit memiliki nilai kembalian, 
nullFuture<?> future1 = pool.submit(runnable);System.out.println("future1 Hasil:" + future1.get()); // ekspor null

// Gunakan metode submit untuk mengirimkan tugas yang dapat Callable dengan nilai balik untuk mendapatkan hasil perhitungan.
Future<Integer> future2 = pool.submit(callable);System.out.println("future2 Hasil:" + future2.get()); 

//Ekspor 
2

//Tutup thread pool
pool.shutdown();

15. Apa yang dimaksud dengan Pengurutan ulang kode Java?

Pengurutan ulang kode adalah teknik pengoptimalan di mana kompiler dan prosesor menyusun ulang instruksi saat menjalankan program untuk meningkatkan kinerja. Tetapi penyusunan ulang tidak sembarangan, perlu mengikuti dua prinsip berikut:

Hasil dari menjalankan program tidak dapat diubah dalam lingkungan berulir tunggal, ini disebut semantik as-of-serial.

Pengurutan ulang tidak diperbolehkan jika terdapat ketergantungan data. Yaitu jika satu operasi perlu menggunakan hasil dari operasi lain, maka urutan kedua operasi tersebut tidak dapat dibalik.
Perhatikan bahwa pengurutan ulang tidak memengaruhi hasil eksekusi dalam lingkungan berulir tunggal. Tetapi dapat merusak semantik eksekusi berulir jamak, yang menyebabkan masalah visibilitas memori.

Pengurutan ulang kode dapat dibagi menjadi tiga kasus berikut:

  • Pengurutan ulang kompiler: kompiler dapat menyesuaikan urutan pernyataan kode untuk meningkatkan efisiensi eksekusi tanpa mengubah semantik program berulir tunggal. Sebagai contoh, menempatkan beberapa operasi pada variabel yang sama secara bersamaan akan mengurangi jumlah pembacaan dan penulisan register.
  • Pengurutan Ulang Instruksi: Prosesor akan menggunakan paralelisme tingkat instruksi untuk tumpang tindih beberapa instruksi selama eksekusi. Dan jika tidak ada ketergantungan data, prosesor dapat mengubah urutan eksekusi instruksi untuk meningkatkan hasil. Misalnya, sambil menunggu memori untuk membaca data, prosesor dapat mengeksekusi instruksi lain yang sudah siap terlebih dahulu.
  • Pengurutan ulang sistem memori: Karena prosesor memiliki buffer baca dan tulis, buffer tulis tidak di-flush ke memori secara tepat waktu. Sehingga prosesor lain membaca nilai yang tidak mutakhir, menyebabkan prosesor melakukan operasi baca dan tulis dengan urutan yang tidak konsisten dengan urutan yang tercermin dalam memori. Sebagai contoh, dalam lingkungan multi-threaded, satu thread memodifikasi nilai variabel bersama. Tetapi thread lain tidak melihat modifikasi tersebut karena nilai yang dimodifikasi masih dalam buffer tulis dan tidak disinkronkan ke memori utama.

Untuk mencegah masalah yang disebabkan oleh pemanggilan ulang, kita perlu menggunakan beberapa cara untuk menonaktifkan atau membatasi pemanggilan ulang:

  • Blokir pengurutan ulang kompilator: gunakan kata kunci volatile untuk memodifikasi variabel bersama untuk memberitahu kompilator agar tidak mengurutkan ulang atau mengoptimalkan variabel ini.
  • Blokir pengurutan ulang instruksi dan pengurutan ulang sistem memori: gunakan penghalang memori atau instruksi awalan Lock untuk memaksa cache di-flush dan memastikan instruksi dieksekusi secara berurutan.

16. Mengapa kita mengeksekusi method run() ?

Ketika kita memanggil method start() mengapa kita tidak bisa memanggil method run() secara langsung?

Ketika method start() dipanggil, thread baru dibuat dan dimulai dan kode dalam method run() dieksekusi. Pada saat ini, thread dalam keadaan ready, setelah CPU time slice, maka akan mulai mengeksekusi method run(). Di sini method run() disebut dengan thread body, yang berisi isi dari thread yang akan dieksekusi. method run() selesai dijalankan, maka thread akan langsung diakhiri.

Namun, jika Anda memanggil method run() secara langsung, maka tidak akan membuat dan memulai thread baru. Juga tidak akan dieksekusi dalam kondisi ready menunggu penjadwalan CPU. Tetapi akan mengeksekusi kode dalam method run() secara langsung di thread utama. Ini sama dengan mengeksekusi metode run() sebagai metode normal, dan tidak memiliki efek multithreading.

Singkatnya, metode start() dipanggil untuk mendapatkan keuntungan dari multithreading, yang memungkinkan beberapa thread untuk dieksekusi secara bersamaan. Memanggil metode run() hanya mengeksekusi secara berurutan di thread utama dan tidak mencapai tujuan penulisan thread.

17. Perbedaan Antara Thread Normal (Thread Non-Daemon) dan Thread Daemon

Di Java, perbedaan utama antara thread biasa (thread non-daemon) dan thread daemon adalah perilakunya di akhir program.

thread non-daemon: Benang biasa adalah benang kerja utama program. JVM mengakhiri program ketika hanya ada thread daemon yang tersisa dalam program dan tidak ada thread non-daemon yang aktif. Artinya, jika ada thread pengguna yang masih berjalan, JVM tidak akan berhenti.

Daemon Threads: Daemon thread terutama digunakan sebagai pekerjaan pendukung, menyediakan layanan kepada thread (pengguna) lainnya.

Sebagai contoh, thread pengumpul sampah adalah sebuah thread daemon yang khas. Peran utamanya adalah membersihkan memori yang tidak lagi digunakan di latar belakang untuk digunakan oleh thread lain dalam program.

Ketika semua thread non-daemon dalam program selesai, JVM menganggap bahwa layanan dari thread daemon tidak lagi dibutuhkan, sehingga JVM akan berhenti, dan semua thread daemon juga akan dihentikan.

Perhatikan bahwa Anda dapat menggunakan metode setDaemon(true) dari kelas Thread untuk menetapkan thread sebagai daemon ketika Anda membuatnya. Tetapi ini harus dilakukan sebelum metode start() dipanggil.

Selain itu, secara default, sebuah thread mewarisi “status daemon” dari induknya, yang berarti bahwa jika induknya adalah sebuah thread daemon, maka anaknya juga merupakan sebuah thread daemon.

18. Apa perbedaan antara CyclicBarrier dan CountdownLatch di Java?

CyclicBarrier dan CountdownLatch merupakan kelas pembantu sinkronisasi yang disediakan dalam paket konkurensi, dan dapat digunakan untuk mengoordinasikan eksekusi di antara beberapa thread. Tetapi keduanya memiliki perbedaan sebagai berikut:

CyclicBarrier dapat digunakan kembali, sedangkan CountdownLatch tidak dapat digunakan kembali. CyclicBarrier secara otomatis mengatur ulang penghitung setelah melepaskan thread yang menunggu, sehingga dapat didaur ulang. penghitung CountdownLatch hanya dapat digunakan sekali kecuali jika instance baru dibuat.

Tindakan dasar CyclicBarrier adalah menunggu, yang memicu tindakan penghalang opsional ketika semua thread telah memanggil metode menunggu, dan kemudian melepaskan semua thread yang menunggu. Tindakan dasar CountdownLatch adalah countDown dan menunggu, yang dapat dipanggil oleh thread apa pun.

Operasi dasar dari CountdownLatch adalah countDown dan wait, yang dapat dipanggil oleh thread mana pun untuk mengurangi penghitung sebanyak satu kali, dan wait, yang hanya dapat dipanggil oleh thread utama untuk menunggu penghitung kembali ke nol.

CyclicBarrier berfokus pada beberapa thread yang saling menunggu, mengharuskan semua thread mencapai titik penghalang pada waktu yang sama, sedangkan CountdownLatch berfokus pada satu atau beberapa thread yang menunggu sekelompok thread lain untuk menyelesaikan operasi, tanpa mengharuskan semua thread mencapai titik penghalang pada waktu yang sama.

Sebagai contoh, CyclicBarrier cocok untuk skenario di mana beberapa thread perlu berkolaborasi dalam suatu tugas, seperti dalam game multipemain di mana semua pemain siap untuk bermain. Sementara CountdownLatch cocok untuk skenario di mana satu atau beberapa thread perlu menunggu sekelompok thread lain untuk menyelesaikan beberapa operasi sebelum melanjutkan. Seperti thread utama yang menunggu anak thread menyelesaikan kueri pesanan atau pesanan pengiriman sebelum melanjutkan. Memeriksa pesanan dan mengirimkan pesanan sebelum merekonsiliasinya.

Berikut adalah beberapa contoh kode CyclicBarrier dan CountdownLatch:

Contoh kode CyclicBarrier:

// Create a CyclicBarrier, specify the barrier point as 5 threads, and set a barrier action CyclicBarrier 
cyclicBarrier = new CyclicBarrier(5, () -> { System.out.println("All threads have reached the barrier point and are starting to perform the barrier action "); }); 

// Create 5 threads to simulate 5 players preparing for the game 
for (int i = 0; i < 5; i++) { new Thread(() -> { try { System.out.println(Thread.currentThread().getName() + "Preparing for game");            Thread.sleep((long) (Math.random() * 10000)); 

// simulate the preparation time System.out.println(Thread.currentThread().getName() + "Ready, waiting for other players"); cyclicBarrier .await(); 

// wait for other threads to reach the barrier point System.out.println(Thread.currentThread().getName() + "Start game"); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } }).start();}

Contoh kode untuk CountdownLatch:

// Create a CountDownLatch, specify the counter as 2CountDownLatch countDownLatch = new CountDownLatch(2); 

// Create a main thread to simulate a reconciliation operation 
new Thread(() -> { try { System.out. println("Main thread waiting for child thread to complete query operation"); countDownLatch.await(); 

//Wait for counter to go to zero 
System.out.println("Main thread starting reconciliation operation"); } catch (InterruptedException e) { e. printStackTrace(); }}).start(); 

//create two sub-threads to simulate the operations of querying an order and dispatching an order respectively 
new Thread(() -> { try { System.out.println("Sub-thread 1 querying an order"); Thread.sleep(5000); 

//simulate the querying time 
System.out.println("Subthread 1 query order complete"); countDownLatch.countDown(); 

// counter minus one 
} catch (InterruptedException e) { e.printStackTrace(); }}).start() ;new Thread(() -> { try { System.out.println("Subthread 2 querying delivery order"); Thread.sleep(3000); 

// simulate query time 
System.out.println("Subthread 2 querying delivery order complete"); countDownLatch. countDown(); 

//counter minus one 
} catch (InterruptedException e) { e.printStackTrace(); }}).start();

19. Apa itu Objek Tidak Berubah dan bagaimana hal itu membantu dalam menulis aplikasi bersamaan?

Objek Tidak Berubah (Immutable Objects) berarti bahwa setelah sebuah objek dibuat. Keadaannya (data objek, yaitu nilai atribut objek) tidak dapat diubah. Dan sebaliknya untuk Objek Berubah (Mutable Objects).

Kelas objek yang tidak dapat diubah yaitu kelas yang tidak dapat diubah (Immutable Class). pustaka kelas platform Java berisi banyak kelas yang tidak dapat diubah. Seperti String, tipe-tipe dasar kelas pembungkus (wrapper class), BigInteger dan BigDecimal dan lain sebagainya.

Objek yang tidak dapat diubah memiliki banyak keuntungan:

  • Objek yang tidak dapat diubah secara inheren aman terhadap thread. Konstanta (field) mereka dibuat di dalam konstruktor. Karena statusnya tidak dapat dimodifikasi, konstanta ini tidak pernah berubah. Hal ini menghindari masalah sinkronisasi ketika diakses secara bersamaan oleh beberapa thread.
  • Objek yang tidak berubah meningkatkan semantik dan meningkatkan keterbacaan kode. Ketika membaca kode, dimungkinkan untuk membedakan konstanta dan variabel read-only dari variabel yang dapat berubah dengan cepat.
  • Objek yang tidak dapat diubah dapat digunakan sebagai kunci dari sebuah Peta dan elemen dari sebuah Himpunan karena biasanya tidak berubah setelah dibuat.
  • Objek yang tidak dapat diubah dapat mempermudah penulisan, penggunaan, dan penalaran kode. Invariant kelas ditetapkan dan tetap tidak berubah setelah pembuatan.
  • Objek yang tidak berubah dapat memudahkan untuk memparalelkan program karena tidak ada konflik di antara mereka.
  • Objek yang tidak berubah dapat menjaga kondisi internal program tetap konsisten, bahkan jika terjadi pengecualian.
  • Referensi ke objek yang tidak berubah dapat di-cache karena tidak berubah. (Sebagai contoh, menyediakan operasi cepat dalam tabel hash).

Kekurangan dari objek yang tidak dapat diubah adalah:

  • Objek baru harus dibuat setiap kali nilai objek perlu dimodifikasi. Hal ini meningkatkan overhead pembuatan objek, serta beban pengumpulan sampah.
  • Jika objek berisi referensi ke objek lain yang dapat berubah, referensi ini dapat dimodifikasi, sehingga menghancurkan keabadian.
  • Untuk membuat kelas yang tidak dapat diubah, kondisi berikut harus dipenuhi:

Kelas itu sendiri dinyatakan final dan tidak dapat diwariskan.

  • Semua field dinyatakan final dan bersifat privat dan tidak dapat dimodifikasi atau diakses.
  • Akses ke komponen yang dapat diubah dicapai dengan penyalinan defensif.
  • Jangan membocorkan referensi ini di konstruktor untuk menghindari akses awal oleh thread lain.

20. Apa yang dimaksud dengan grup thread dan mengapa tidak direkomendasikan di Java?

Grup thread adalah kumpulan thread yang dapat dikategorikan dan dikelola. Java menggunakan kelas ThreadGroup untuk merepresentasikan grup thread. Menyediakan metode untuk mengatur properti grup thread. Mendapatkan informasi tentang grup, menangani pengecualian yang tidak tertangkap di dalam grup, dll.

Grup thread ada dalam struktur pohon, dan setiap thread termasuk dalam grup thread. Grup thread ada dalam struktur pohon, setiap thread termasuk dalam grup thread , setiap grup thread memiliki grup thread induk hingga sistem grup thread root. Secara default, semua thread termasuk dalam grup thread utama.

Grup thread dan kumpulan thread adalah dua konsep yang berbeda, dan perannya sangat berbeda. Grup thread digunakan untuk memfasilitasi manajemen thread, sedangkan thread pool digunakan untuk mengelola siklus hidup thread, menggunakan kembali thread, dan mengurangi overhead dalam membuat dan menghancurkan thread. Ada beberapa alasan mengapa thread group tidak direkomendasikan di Java:

  • API untuk kelompok thread dirancang dengan buruk, beberapa metode telah usang, dan beberapa metode tidak mengimplementasikan fungsionalitas yang dimaksudkan.
  • Grup thread tidak mencegah akses ilegal, sebuah thread dapat mengakses dan memodifikasi thread apapun dalam grup thread lainnya.
  • Grup thread tidak menyediakan fungsionalitas tambahan yang dapat digantikan dengan cara lain. Sebagai contoh, metode setUncaughtExceptionHandler dari kelas Thread dapat digunakan untuk menangani pengecualian yang tidak tertangkap. Dan kerangka kerja Eksekutor dapat digunakan untuk mengelola dan menggunakan kembali thread.

Singkatnya, kelompok thread adalah konsep yang sudah ketinggalan zaman dan tidak efisien yang tidak direkomendasikan untuk digunakan di Java.

Related posts

Leave a Reply

Your email address will not be published. Required fields are marked *