Kata pengantar
Artikel-artikel sebelumnya fokus pada optimalisasi basis data layanan back-end dan pemrosesan paralel multi-threaded, dan contoh logika pseudocode sebelum dan sesudah transformasi. Tentu saja, optimasi tidak ada habisnya. Generasi sebelumnya menanam pohon dan generasi selanjutnya menikmati naungan. Sebagai pengembang, karena kami berdiri di atas bahu raksasa, kami harus menulis program yang lebih dioptimalkan.
Kasus Pengembangan Springboot JDBCTEMPLATE OPERASI BATCH
Kasus Pengembangan Springboot: Pengolahan Paralel Multitasking Countdownlatch
Renovasi
Secara teoritis, semakin banyak utas, semakin cepat program mungkin, tetapi dalam penggunaan aktual, kita perlu mempertimbangkan konsumsi sumber daya dari utas itu sendiri penciptaan dan penghancuran, serta tujuan melindungi sistem operasi itu sendiri. Kita biasanya perlu membatasi utas ke kisaran tertentu, dan kumpulan utas memainkan peran ini.
Logika Program
Multitasking paralel + thread pool process.png
Masalah yang dapat diselesaikan dengan gambar harus sesedikit mungkin. Tentu saja, prinsip yang mendasari masih perlu diingat dan dipahami oleh semua orang.
Java Thread Pool
Java menyediakan empat jenis kumpulan benang melalui pelaksana, yaitu:
keuntungan
Implementasi Kode
Metode 1 (Countdownlatch)
/*** Multitasking Paralel + Statistik kumpulan utas* Waktu Penciptaan 17 April 2018*/Statsdemo kelas publik {final static SimpleDateFormat SDF = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); string statis final startTime = sdf.format (new date ()); /** * IO-intensive tasks = generally 2*number of CPU cores (often in threads: database data interaction, file upload and download, network data transmission, etc.) * CPU-intensive tasks = generally 1 CPU cores + 1 (often in threads: complex algorithms) * Hybrid tasks = depending on machine configuration and complexity self-test */ private static int corePoolSize = Runtime.getRuntime (). Tersedia Processors (); /*** ThreadPoolExecutor publik (int corePoolsize, int maximumpoolsize, Keepalivetime panjang,* unit timeunit, blockingqueue <runnable> workqueue)* CorePoolsize digunakan untuk menentukan jumlah thread inti* Maksimal. Antrian buffer dari kumpulan utas, dan utas yang belum dieksekusi akan menunggu dalam antrian* monitor panjang antrian untuk memastikan bahwa antrian yang dibatasi* Ukuran kumpulan benang yang tidak tepat dapat memperlambat kecepatan pemrosesan, mengurangi stabilitas, dan menyebabkan kebocoran memori. Jika ada terlalu sedikit utas yang dikonfigurasi, antrian akan terus tumbuh lebih besar dan mengkonsumsi terlalu banyak memori. * Dan terlalu banyak utas akan memperlambat kecepatan seluruh sistem karena pergantian konteks yang sering - dan hasil akhir yang sama akan dicapai. Panjang antrian sangat penting, harus dibatasi sehingga jika kumpulan utas kewalahan, ia dapat untuk sementara waktu dapat menolak permintaan baru. * Implementasi default dari ExecutorService adalah LinkedBlockingQueue yang tidak terikat. */ private static ThreadPoolExecutor Executor = New ThreadPoolExecutor (corePoolsize, corePoolsize+1, 10L, timeunit.seconds, LinkedBlockingQueue baru <Runnable> (1000)); public static void main (String [] args) melempar InterruptedException {Countdownlatch Latch = NEW COUNTDOWNLATCH (5); // Gunakan Metode Eksekusi Executor.Execute (Statistik Baru ("Tugas A", 1000, Latch)); Executor.Execute (statistik baru ("Tugas B", 1000, kait)); Executor.Execute (statistik baru ("Tugas C", 1000, kait)); Executor.Execute (statistik baru ("Tugas D", 1000, kait)); Executor.Execute (statistik baru ("Tugas E", 1000, kait)); latch.Await (); // tunggu tugas semua orang ke end system.out.println ("Semua eksekusi tugas statistik selesai:" + sdf.format (tanggal baru ())); } statistik statis statis mengimplementasikan runnable {string statsname; int runtime; Latch Countdownlatch; statistik publik (string statsname, int runtime, countdownlatch latch) {this.statsname = statsname; this.runtime = runtime; this.latch = latch; } public void run () {coba {System.out.println (StatSname+ "Do Stats Mulai dari"+ startTime); // Simulasikan utas waktu eksekusi tugas. Sleep (runtime); System.out.println (StatSname + "Do Stats Complete at" + sdf.format (new date ())); latch.countdown (); // Satu tugas berakhir, penghitung dikurangi dengan satu} tangkapan (interruptedException e) {e.printstacktrace (); }}}}Metode 2 (masa depan)
/*** Multitasking Paralel + Statistik kumpulan utas* Waktu Penciptaan 17 April 2018*/Statsdemo kelas publik {final static SimpleDateFormat SDF = new SimpleDateFormat ("yyyy-mm-dd hh: mm: ss"); string statis final startTime = sdf.format (new date ()); /** * IO-intensive tasks = generally 2*number of CPU cores (often in threads: database data interaction, file upload and download, network data transmission, etc.) * CPU-intensive tasks = generally 1 CPU cores + 1 (often in threads: complex algorithms) * Hybrid tasks = depending on machine configuration and complexity self-test */ private static int corePoolSize = Runtime.getRuntime (). Tersedia Processors (); /*** ThreadPoolExecutor publik (int corePoolsize, int maximumpoolsize, Keepalivetime panjang,* unit timeunit, blockingqueue <runnable> workqueue)* CorePoolsize digunakan untuk menentukan jumlah thread inti* Maksimal. Antrian buffer dari kumpulan utas, dan utas yang belum dieksekusi akan menunggu dalam antrian* monitor panjang antrian untuk memastikan bahwa antrian yang dibatasi* Ukuran kumpulan benang yang tidak tepat dapat memperlambat kecepatan pemrosesan, mengurangi stabilitas, dan menyebabkan kebocoran memori. Jika ada terlalu sedikit utas yang dikonfigurasi, antrian akan terus tumbuh lebih besar dan mengkonsumsi terlalu banyak memori. * Dan terlalu banyak utas akan memperlambat kecepatan seluruh sistem karena pergantian konteks yang sering - dan hasil akhir yang sama akan dicapai. Panjang antrian sangat penting, harus dibatasi sehingga jika kumpulan utas kewalahan, ia dapat untuk sementara waktu dapat menolak permintaan baru. * Implementasi default dari ExecutorService adalah LinkedBlockingQueue yang tidak terikat. */ private static ThreadPoolExecutor Executor = New ThreadPoolExecutor (corePoolsize, corePoolsize+1, 10L, timeunit.seconds, LinkedBlockingQueue baru <Runnable> (1000)); public static void main (string [] args) melempar InterruptedException {List <Future <string>> resultList = new ArrayList <Future <String> (); // Gunakan Kirim Tugas Asinkron dan Dapatkan Nilai Pengembalian sebagai Hasil Hasil Masa Depan. resultlist.add (executor.submit (statistik baru ("Tugas B", 1000))); resultlist.add (executor.submit (statistik baru ("Tugas C", 1000))); resultlist.add (executor.submit (statistik baru ("tugas d", 1000))); resultlist.add (executor.submit (statistik baru ("Tugas E", 1000))); //Result of the traversal task for (Future<String> fs: resultList) { try { System.out.println(fs.get());//Print the results of each line task execution, call future.get() to block the main thread, and get the return result of the asynchronous task} catch (InterruptedException e) { e.printStackTrace(); } catch (executionException e) {e.printstacktrace (); } Akhirnya {// Mulai sekali dan jalankan tugas yang dikirimkan sebelumnya, tetapi jangan menerima tugas baru. Jika telah ditutup, panggilan tidak memiliki efek lain. executor.shutdown (); }} System.out.println ("Semua tugas statistik dijalankan:" + sdf.format (tanggal baru ())); } Statistik kelas statis mengimplementasikan Callable <string> {String StatSname; int runtime; statistik publik (string statsname, int runtime) {this.statsname = statsname; this.runtime = runtime; } public string call () {coba {System.out.println (StatSname+ "Do Stats Mulai dari"+ startTime); // Simulasikan utas waktu eksekusi tugas. Sleep (runtime); System.out.println (StatSname + "Do Stats Complete at" + sdf.format (new date ())); } catch (InterruptedException e) {E.PrintStackTrace (); } return call (); }}}Waktu pelaksanaan
Kode-kode di atas adalah semua kode semu, dan berikut ini adalah catatan tes nyata dari 2.000+ siswa.
2018-04-17 17: 42: 29.284 Catatan Uji Info 81E51AB031EB4ADA92743DDF66528D82-SINGLE-EKSEKUSI SEUENSI UMUT
2018-04-17 17: 42: 31.452 Catatan Uji Info 81E51AB031EB4ADA92743DDF66528D82-Multi-Threaded Task, waktu yang dihabiskan: 2167
2018-04-17 17: 42: 33.170 Catatan Uji Info 81E51AB031EB4ADA92743DDF66528D82-Multi-Threaded Parallel Tugas + Thread Pool, waktu yang dihabiskan: 1717
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.