Artikel ini membantu Anda menguasai pengetahuan dasar Java Multithreading untuk sesuai dengan masalah yang Anda temui di masa depan. Konten spesifiknya adalah sebagai berikut
1. Pertanyaan Wawancara Java Multi-Threaded
1. Apa perbedaan antara suatu proses dan utas?
Suatu proses adalah lingkungan berjalan mandiri, yang dapat dianggap sebagai program atau aplikasi. Utas adalah tugas yang dieksekusi dalam suatu proses. Lingkungan runtime Java adalah proses tunggal yang berisi kelas dan program yang berbeda. Thread dapat disebut proses ringan. Utas membutuhkan lebih sedikit sumber daya untuk membuat dan tinggal dalam proses dan dapat berbagi sumber daya dalam proses.
2. Apa manfaat dari pemrograman multi-threaded?
Dalam program multi-threaded, banyak utas dieksekusi secara bersamaan untuk meningkatkan efisiensi program, dan CPU tidak akan memasuki keadaan idle karena utas tertentu perlu menunggu sumber daya. Beberapa utas berbagi banyak memori, sehingga membuat banyak utas untuk melakukan beberapa tugas lebih baik daripada membuat banyak proses. Misalnya, servlet lebih baik daripada CGI karena servlets mendukung multithreading sementara CGI tidak.
3. Apa perbedaan antara utas pengguna dan utas daemon?
Saat kami membuat utas dalam program Java, itu disebut utas pengguna. Utas daemon adalah utas yang dieksekusi di latar belakang dan tidak memblokir JVM diakhiri. Ketika tidak ada utas pengguna yang berjalan, JVM menutup program dan keluar. Utas anak yang dibuat oleh utas daemon masih merupakan benang daemon.
4. Bagaimana kita membuat utas?
Ada dua cara untuk membuat utas: satu adalah dengan mengimplementasikan antarmuka yang dapat dijalankan, lalu berikan ke konstruktor utas, dan membuat objek utas; Yang lainnya adalah secara langsung mewarisi kelas utas. Untuk informasi lebih lanjut, Anda dapat membaca artikel ini tentang cara membuat utas di Java.
5. Apa saja siklus hidup utas yang berbeda?
Saat kami membuat utas baru dalam program Java, statusnya baru. Ketika kita memanggil metode start () dari utas, status diubah menjadi runnable. Penjadwal Thread mengalokasikan waktu CPU untuk utas di kumpulan utas yang dapat dijalankan dan mengubah keadaan mereka untuk berjalan. Status utas lainnya termasuk menunggu, diblokir dan mati. Baca artikel ini untuk mempelajari lebih lanjut tentang siklus hidup utas.
6. Dapatkah saya secara langsung memanggil metode run () dari kelas utas?
Tentu saja, tetapi jika kita memanggil metode thread's run (), itu akan berperilaku sama dengan metode normal. Untuk menjalankan kode kami di utas baru, metode thread.start () harus digunakan.
7. Bagaimana cara menjeda utas yang berjalan untuk jangka waktu tertentu?
Kita dapat menggunakan metode tidur () dari kelas utas untuk menjeda utas untuk jangka waktu tertentu. Perlu dicatat bahwa ini tidak menyebabkan utas berakhir. Setelah utas dibangunkan dari hibernasi, keadaan utas akan diubah menjadi runnable, dan sesuai dengan penjadwalan utas, itu akan dieksekusi.
8. Apa pemahaman Anda tentang prioritas utas?
Setiap utas memiliki prioritas. Secara umum, utas prioritas tinggi akan memiliki prioritas saat berjalan, tetapi ini tergantung pada implementasi penjadwalan utas, yang terkait dengan sistem operasi (tergantung OS). Kami dapat mendefinisikan prioritas utas, tetapi ini tidak menjamin bahwa utas prioritas tinggi akan dieksekusi di depan utas prioritas rendah. Prioritas utas adalah variabel int (dari 1-10), 1 mewakili prioritas terendah dan 10 mewakili prioritas tertinggi.
9. Apa penjadwal utas dan pengiris waktu?
Penjadwal Thread adalah layanan sistem operasi yang bertanggung jawab untuk mengalokasikan waktu CPU untuk utas dalam keadaan runnable. Setelah kami membuat utas dan memulainya, eksekusi tergantung pada implementasi penjadwal utas. Waktu sharding mengacu pada proses mengalokasikan waktu CPU yang tersedia untuk utas runnable yang tersedia. Waktu CPU yang dialokasikan dapat didasarkan pada prioritas utas atau waktu tunggu utas. Penjadwalan utas tidak dikendalikan oleh mesin virtual Java, jadi lebih baik mengendalikannya dengan aplikasi (yaitu, jangan biarkan program Anda bergantung pada prioritas utas).
10. Di Multithreading, apa itu pengalihan konteks?
Peralihan konteks adalah proses penyimpanan dan pemulihan status CPU, yang memungkinkan eksekusi utas untuk melanjutkan eksekusi dari titik interupsi. Sakelar konteks adalah fitur dasar dari sistem operasi multi-tugas dan lingkungan multi-threaded.
11. Bagaimana Anda memastikan bahwa utas di mana metode utama () berada adalah utas terakhir yang berakhir dalam program Java?
Kita dapat menggunakan metode gabungan () dari kelas utas untuk memastikan bahwa semua utas yang dibuat oleh program akhir sebelum metode utama () keluar. Berikut adalah artikel tentang metode gabungan () dari kelas utas.
12. Bagaimana utas berkomunikasi?
Ketika sumber daya antar-thread dapat dibagikan, komunikasi antar-thread adalah cara penting untuk mengoordinasikannya. Metode tunggu ()/notify ()/notifyAll () di kelas objek dapat digunakan untuk berkomunikasi di antara utas tentang keadaan kunci tentang sumber daya. Klik di sini untuk lebih lanjut tentang utas Tunggu, beri tahu, dan beri tahu semua.
13. Mengapa metode komunikasi utas menunggu (), notify () dan notifyall () didefinisikan di kelas objek?
Setiap objek di Java memiliki kunci (monitor, yang juga bisa berupa monitor) dan tunggu (), beri tahu () dan metode lain digunakan untuk menunggu kunci objek atau memberi tahu objek utas lainnya yang tersedia. Tidak ada kunci dan sinkronisasi yang tersedia untuk objek apa pun untuk digunakan di utas Java. Inilah sebabnya mengapa metode ini merupakan bagian dari kelas objek, sehingga setiap kelas di Java memiliki metode dasar untuk komunikasi antar-utang
14. Mengapa harus menunggu (), notify () dan notifyAll () dipanggil dalam metode sinkronisasi atau blok sinkronisasi?
Ketika utas perlu memanggil metode tunggu () dari objek, utas harus memiliki kunci objek. Kemudian melepaskan kunci objek dan memasuki keadaan menunggu sampai utas lain memanggil metode notify () pada objek. Demikian pula, ketika utas perlu memanggil metode pemberitahuan objek (), itu akan melepaskan kunci objek sehingga utas lain yang menunggu untuk mendapatkan kunci objek. Karena semua metode ini memerlukan utas untuk menahan kunci objek, mereka hanya dapat diimplementasikan melalui sinkronisasi, sehingga mereka hanya dapat dipanggil dalam metode sinkronisasi atau blok sinkronisasi.
15. Mengapa metode tidur () dan hasil () dari kelas utas statis?
Metode Sleep () dan Yield () dari kelas utas akan berjalan pada utas yang sedang dieksekusi. Jadi tidak masuk akal untuk memanggil metode ini di utas lain yang dalam keadaan menunggu. Itu sebabnya metode ini statis. Mereka dapat bekerja di utas yang saat ini dieksekusi dan menghindari keyakinan programmer yang keliru bahwa metode ini dapat dipanggil di utas non-lari lainnya.
16. Bagaimana cara memastikan keamanan utas?
Ada banyak cara untuk memastikan keamanan utas di Java - sinkronisasi, menggunakan kelas -kelas bersamaan atom, mengimplementasikan kunci bersamaan, menggunakan kata kunci yang mudah menguap, menggunakan kelas invarian dan kelas yang aman. Anda dapat mempelajari lebih lanjut di tutorial keselamatan utas.
17. Apa peran kata kunci yang mudah menguap di Java?
Ketika kami menggunakan kata kunci volatil untuk memodifikasi variabel, utas akan langsung membaca variabel dan tidak men apa saja. Ini memastikan bahwa variabel yang dibaca oleh utas konsisten dalam memori.
18. Manakah pilihan yang lebih baik, metode sinkronisasi atau blok sinkronisasi?
Blok sinkron adalah pilihan yang lebih baik karena tidak akan mengunci seluruh objek (dan tentu saja Anda juga dapat membiarkannya mengunci seluruh objek). Metode sinkronisasi mengunci seluruh objek, bahkan jika ada beberapa blok sinkronisasi yang tidak terkait di kelas, yang biasanya menyebabkan mereka berhenti mengeksekusi dan perlu menunggu untuk mendapatkan kunci pada objek.
19. Bagaimana cara membuat benang daemon?
Gunakan metode setdaemon (true) dari kelas utas untuk metode setdaemon (true) untuk mengatur utas sebagai utas daemon. Perlu dicatat bahwa metode ini perlu dipanggil sebelum memanggil metode Start (), jika tidak, IllegalThreadStateException akan dilemparkan.
20. Apa itu Threadlocal?
Threadlocal digunakan untuk membuat variabel lokal untuk utas. Kita tahu bahwa semua utas suatu objek akan berbagi variabel globalnya, sehingga variabel-variabel ini tidak aman dan kami dapat menggunakan teknik sinkronisasi. Tetapi ketika kami tidak ingin menggunakan sinkronisasi, kami dapat memilih variabel utas.
Setiap utas akan memiliki variabel utas sendiri, yang dapat menggunakan metode get ()/set () untuk mendapatkan nilai default mereka atau mengubah nilainya secara internal. Contoh utas biasanya ingin mereka dikaitkan dengan keadaan utas sebagai atribut statis pribadi. Dalam artikel ini, Anda dapat melihat program kecil tentang Threadlocal.
21. Apa itu Grup Thread? Mengapa tidak disarankan?
ThreadGroup adalah kelas yang tujuannya adalah untuk memberikan informasi tentang grup utas.
API ThreadGroup relatif lemah, dan tidak menawarkan lebih banyak fitur daripada utas. Ini memiliki dua fungsi utama: satu adalah untuk mendapatkan daftar utas aktif dalam grup utas; Yang lainnya adalah mengatur handler pengecualian yang tidak tertulis untuk utas. Namun, di Java 1.5, kelas utas juga menambahkan metode setuncaughtExceptionHandler (UncaughtExceptionHandler EH), sehingga threadgroup sudah ketinggalan zaman dan tidak disarankan untuk terus menggunakannya.
t1.setuncaughtExceptionHandler (new UncaughtExceptionHandler () {@Override public void UncaughtException (Thread t, Throwable e) {System.out.println ("Exception terjadi:"+e.getMessage ());}}); 22. Apa itu dump java thread dan bagaimana mendapatkannya?
Thread Dump adalah daftar utas aktif JVM yang sangat berguna untuk menganalisis bottleneck sistem dan kebuntuan. Ada banyak cara untuk mendapatkan dump utas - menggunakan perintah profiler, kill -3, alat JStack, dll. Saya lebih suka alat JStack karena mudah digunakan dan dilengkapi dengan JDK. Karena ini adalah alat berbasis terminal, kita dapat menulis beberapa skrip untuk menghasilkan dump utas yang tepat waktu untuk analisis. Baca dokumen ini untuk mempelajari lebih lanjut tentang menghasilkan dump utas.
23. Apa itu kebuntuan? Bagaimana cara menganalisis dan menghindari kebuntuan?
Deadlock mengacu pada situasi di mana lebih dari dua utas diblokir selamanya. Situasi ini membutuhkan setidaknya dua utas dan lebih dari dua sumber daya.
Untuk menganalisis kebuntuan, kita perlu melihat dump utas dari aplikasi Java. Kita perlu mengetahui utas -utas itu dengan status diblokir dan sumber daya yang mereka tunggu. Setiap sumber memiliki ID unik. Menggunakan ID ini kita dapat mengetahui utas mana yang sudah memiliki kunci objeknya.
Menghindari kunci bersarang, hanya menggunakan kunci di mana mereka dibutuhkan dan menghindari penantian yang tidak terbatas adalah cara yang biasa untuk menghindari kebuntuan, baca artikel ini untuk mempelajari cara menganalisis kebuntuan.
24. Apa kelas timer Java? Bagaimana cara membuat tugas dengan interval waktu tertentu?
java.util.timer adalah kelas alat yang dapat digunakan untuk menjadwalkan utas untuk dieksekusi pada waktu tertentu di masa depan. Kelas timer dapat diatur dengan menjadwalkan tugas satu kali atau tugas berkala.
java.util.timertask adalah kelas abstrak yang mengimplementasikan antarmuka yang dapat dijalankan. Kita perlu mewarisi kelas ini untuk membuat tugas waktu kita sendiri dan menggunakan pengatur waktu untuk mengatur eksekusi.
25. Apa itu Benang Kolam? Bagaimana cara membuat kumpulan benang java?
Sebuah kumpulan utas mengelola satu set utas pekerja, dan juga termasuk antrian untuk menempatkan tugas yang menunggu untuk dieksekusi.
java.util.concurrent.executors menyediakan implementasi antarmuka java.util.concurrent.executor untuk membuat kumpulan utas. Contoh kumpulan utas menunjukkan cara membuat dan menggunakan kumpulan utas, atau membaca contoh yang dijadwalkan.
2. Pertanyaan Wawancara Bersamaan Java
1. Apa itu operasi atom? Kelas atom apa yang ada di Java Concurrency API?
Operasi atom mengacu pada unit tugas operasi yang tidak terpengaruh oleh operasi lain. Operasi atom adalah cara yang diperlukan untuk menghindari ketidakkonsistenan data dalam lingkungan multi-utas.
Int ++ bukan operasi atom, jadi ketika utas membaca nilainya dan menambahkan 1, utas lain dapat membaca nilai sebelumnya, yang akan menimbulkan kesalahan.
Untuk mengatasi masalah ini, perlu untuk memastikan bahwa operasi penambahan adalah atom, dan kami dapat menggunakan teknologi sinkronisasi untuk melakukan ini sebelum JDK1.5. Ke JDK1.5, paket java.util.concurrent.atomic menyediakan jenis kelas pemuatan int dan panjang, yang secara otomatis dapat memastikan bahwa mereka adalah atom untuk operasi mereka dan tidak memerlukan sinkronisasi.
2. Apa antarmuka kunci di Java Concurrency API? Apa keuntungan membandingkan sinkronisasi?
Antarmuka kunci menyediakan operasi kunci yang lebih diskalakan daripada metode sinkronisasi dan blok sinkronisasi. Mereka memungkinkan untuk struktur yang lebih fleksibel, dapat memiliki sifat yang sama sekali berbeda, dan dapat mendukung objek bersyarat dari beberapa kelas terkait.
Keuntungannya adalah:
Ini dapat membuat kunci lebih adil, sehingga utas merespons interupsi sambil menunggu kunci, sehingga utas dapat mencoba memperoleh kunci, dan segera kembali ketika tidak dapat memperoleh kunci atau menunggu untuk jangka waktu tertentu, yang dapat diperoleh dan dirilis dalam pesanan yang berbeda dalam rentang yang berbeda.
3. Apa kerangka kerja pelaksana?
Kerangka kerja eksekutor diperkenalkan di Java 5 dengan antarmuka java.util.concurrent.executor. Kerangka kerja pelaksana adalah kerangka kerja yang mengeksekusi tugas asinkron yang melaksanakan panggilan kebijakan, jadwal, mengeksekusi dan mengontrol sesuai dengan serangkaian kebijakan.
Utas pembuatan tanpa batas dapat menyebabkan overflow memori aplikasi. Jadi membuat kumpulan utas adalah solusi yang lebih baik karena jumlah utas dapat dibatasi dan jumlah utas dapat didaur ulang dan digunakan kembali. Menggunakan kerangka kerja Executors dapat dengan mudah membuat kumpulan utas. Baca artikel ini untuk mempelajari cara menggunakan kerangka kerja pelaksana untuk membuat kumpulan utas.
4. Apa itu antrian pemblokiran? Bagaimana cara mengimplementasikan model konsumen produser menggunakan antrian pemblokiran?
Fitur java.util.concurrent.blockingqueue adalah: Ketika antrian kosong, operasi mendapatkan atau menghapus elemen dari antrian akan diblokir, atau ketika antrian penuh, pengoperasian penambahan elemen ke antrian akan diblokir.
Antrian pemblokiran tidak menerima nilai nol, dan ketika Anda mencoba menambahkan nilai nol ke antrian, ia melempar nullpointerException.
Implementasi pemblokiran antrian aman-utas, dan semua metode kueri adalah atom dan menggunakan kunci internal atau bentuk kontrol bersamaan lainnya.
Antarmuka BlockingQueue adalah bagian dari Kerangka Koleksi Java, yang terutama digunakan untuk mengimplementasikan masalah konsumen produsen.
5. Apa yang dapat dipanggil dan masa depan?
Java 5 memperkenalkan antarmuka java.util.concurrent.callable dalam paket concurrency. Ini sangat mirip dengan antarmuka runnable, tetapi dapat mengembalikan objek atau melempar pengecualian.
Antarmuka yang dapat dipanggil menggunakan obat generik untuk menentukan jenis pengembaliannya. Kelas Executors menyediakan beberapa metode yang berguna untuk menjalankan tugas di dalam callable di kumpulan utas. Karena tugas yang dapat dipanggil paralel, kita harus menunggu hasilnya kembali. Objek java.util.concurrent.future memecahkan masalah ini bagi kami. Setelah kumpulan utas mengirimkan tugas yang dapat dipanggil, objek di masa depan dikembalikan. Menggunakannya, kita dapat mengetahui status tugas yang dapat dipanggil dan mendapatkan hasil eksekusi yang dikembalikan oleh yang dapat dipanggil. Masa Depan Menyediakan metode get () yang memungkinkan kita menunggu yang dapat dipanggil untuk mengakhiri dan mendapatkan hasil eksekusi.
6. Apa itu Futuretask?
Futuretask adalah implementasi dasar masa depan, kita dapat menggunakannya dengan pelaksana untuk menangani tugas asinkron. Biasanya kita tidak perlu menggunakan kelas Futuretask, menjadi sangat berguna ketika kita berencana untuk menulis ulang beberapa metode antarmuka di masa depan dan menjaga implementasi dasar asli. Kita hanya bisa mewarisi darinya dan menulis ulang metode yang kita butuhkan.
7. Apa implementasi wadah bersamaan?
Kelas koleksi Java semua gagal dengan cepat, yang berarti bahwa ketika set diubah dan utas menggunakan iterator untuk melintasi set, metode Iterator Next () akan melempar pengecualian Exception ConcurrentModification Exception.
Kontainer bersamaan mendukung traversal bersamaan dan pembaruan bersamaan.
Kelas utama adalah concurrenthashmap, copyonWriteArrayList dan copyonWriteArrayset. Baca artikel ini untuk mempelajari cara menghindari ConcurrentModificationException.
8. Apa kelas pelaksana?
Executors menyediakan beberapa metode perkakas untuk pelaksana, ExecutorService, JadwalExecutorService, ThreadFactory, dan kelas yang dapat dipanggil.
Pelaksana dapat digunakan untuk membuat kumpulan utas dengan mudah.
Bahkan, ada banyak pertanyaan wawancara Java yang lebih mendasar, dan Anda dapat mengaturnya secara sistematis.
Saya harap semua orang akan berhasil dalam wawancara!