Posting blog sebelumnya pada dasarnya merangkum beberapa konten dalam konkurensi Java. Posting blog ini terutama dimulai dengan masalah dan melihat teknologi konkurensi mana yang dirangkum di atas dapat digunakan untuk menyelesaikannya.
Simulasi skenario: Memproses 16 catatan log, setiap waktu pencetakan catatan log memakan waktu 1 detik. Dalam keadaan normal, jika 16 catatan ini selesai, dibutuhkan 16 detik. Untuk meningkatkan efisiensi, kami siap memulai 4 utas untuk dicetak, dan mencetaknya dalam 4 detik untuk mewujudkan demo ini.
Mari kita analisis pertanyaan ini terlebih dahulu. Mengenai 16 catatan log ini, kami dapat menghasilkannya di utas utama. Ini tidak sulit. Kuncinya adalah memulai 4 utas untuk dieksekusi. Ada dua ide sekarang: satu adalah bahwa generasi log dan utas yang mencetak log terpisah secara logis; Yang lainnya adalah bahwa generasi log dan utas yang mencetak log secara logis tidak terpisah. Ini mungkin agak tidak jelas. Izinkan saya menulis demo yang diimplementasikan berdasarkan dua ide ini.
Generasi log dan pencetakan log terpisah secara logis.
Ini setara dengan dua front: satu bagian depan terus -menerus menghasilkan log, dan bagian depan lainnya terus mencetak log. Jelas bahwa Anda akan memikirkan penggunaan antrian pemblokiran, dan menghasilkan log yang terus terhubung ke antrian pemblokiran, dan mencetak log yang terus mendapatkan dari antrian pemblokiran. Ukuran antrian pemblokiran dapat diatur sendiri, 16 atau 1, yang tidak mempengaruhi eksekusi. Jadi BlockingQueue akan digunakan, mari kita lihat demo yang diterapkan di bawah ini:
Praktik kelas publik1 {public static void main (string [] args) {// Tentukan antrian blocking, ukuran antrian dapat berisi 16 informasi blockingqueue <string> antrian = arrayblockingqueue baru (string> (16); untuk (int i = 0; i <4; i ++) {// buka empat utas untuk memblokir@@@{@@@{@@@{@{@@{{@{{{{iReove) {{{{{iRaNOVE) (int i = i <4; i ++) void run () {while (true) {try {string log = queue.take (); // dapatkan log parselog (log); // cetak log} catch (interruptedexception e) {// todo catch auto-generated blocke.printstacktrace ();}}}}).}}; (System.currentTimeMillis ()/1000)); untuk (int i = 0; i <16; i ++) {final string log = "" +(i +1); // Tunjukkan log coba {queue.put (log); // subt yang dihasilkan ke dalam penangkapan {queue.put (log); blocke.printstacktrace ();}}} public static void parselog (string log) {// Metode untuk mencetak log log.out.println (thread.currentThread (). getName () + "---" + Log + "---" + (System.CurrentTimeMillis ()/1000 BEBERAPA LOG + "); kedua} catch (InterruptedException E) {// TODO Auto-Encomerated Catch Blocke.PrintStackTrace ();}}}} Ini seperti sistem yang beroperasi, terus -menerus menghasilkan log dan terus membuka banyak utas untuk mencetak informasi log. Demo ditulis dan hasil operasinya tidak diposting.
Generasi log dan pencetakan log tidak terpisah secara logis.
Gagasan ini adalah bahwa ketika saya menghasilkan log, Anda mencetaknya untuk saya dan melakukannya dengan empat utas bersama -sama! Jadi, jika Anda berpikir seperti ini, Anda harus menggunakan kumpulan utas. Saya pertama kali membuat kumpulan utas, yang berisi 4 utas, dan kemudian ketika log dihasilkan, saya meminta kumpulan utas untuk menggunakan utas untuk menjalankannya. Demo adalah sebagai berikut:
Praktik kelas publik1 {public static void main (string [] args) {executorService service = executors.newfixedThreadpool (4); // Buat thread pool System.out.println ("Begin:" +(System.CurrentTimeMillis ()/1000)); for (int i = 0; i <16; i +i + + +() {i +"); service.execute (runnable baru () {// Ambil utas untuk mengeksekusi @Override public void run () {parselog (log);}});} service.shutdown (); // Jangan lupa untuk mematikan kumpulan utas di akhir} load (loadnead). "---" + (System.CurrentTimeMillis ()/1000)); coba {thread.sleep (1000); // Simulasikan mencetak log membutuhkan 1 detik} catch (interruptedException e) {// todo}}}}}}}}}}}}}} TODO Auto-}}}} TODO otomatisMari kita ringkas masalah ini di sini. Jika Anda memahami dua ide ini, Anda umumnya dapat menyelesaikannya secara efektif.
Di atas adalah seluruh konten dari artikel ini tentang pemrograman Java kode contoh masalah multi-threaded, saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!