Mode Thread-Per-Message (pekerjaan ini diserahkan kepada Anda)
Saat Anda sangat sibuk, ada kurir di lantai bawah perusahaan, jadi Anda mempercayakan kolega Anda untuk membantu Anda mendapatkan kurir Anda sehingga Anda dapat terus melakukan pekerjaan Anda
Dalam mode thread-per-message, ujung delegasi pesan dan ujung eksekusi adalah utas yang berbeda. Akhir Delegasi dari pesan akan memberi tahu utas akhir eksekusi, dan pekerjaan ini akan diserahkan kepada Anda.
Kelas Host:
Kelas yang membuat utas untuk permintaan terutama dengan membuka utas baru, memanggil pegangan pembantu, dan menyampaikan teks yang akan dicetak.
host kelas publik {private final helper helper = helper baru (); permintaan public void (hitungan int final, final char c) {system.out.println ("permintaan start"); utas baru () {public void run () {helper.handle (count, c);}}}}; start (); System.out.println ("END);Kelas Pembantu:
Menyediakan fungsi tampilan karakter, metode perlahan mensimulasikan waktu pencetakan
helper kelas publik {handle public void (int count, char c) {system.out.println ("Metode pegangan start"); for (int i = 0; i <count; i ++) {perlahan (); System.out.print (c);} Metode pegangan end.out.println (""); System.out.println ("Metode pegangan end.out.println (" "); System.out.println (" Metode pegangan end handle end "; {Thread.sleep (100);} catch (InterruptedException e) {// TODO AUTO-AUTO-ENTEERATED Catch Blocke.PrintStackTrace ();}}}Kelas Utama:
Buat instance host dan hubungi metode permintaan
public static void main (string [] args) {System.out.println ("Main begin"); host host = host baru (); host.Request (10, 'a'); host.request (20, 'b'); host.request (30, 'c'); System.out.println ("Main End");}Hasil tes:
Mulai utama
Metode permintaan telah dimulai
Akhir dari metode permintaan
Metode permintaan telah dimulai
Akhir dari metode permintaan
Metode permintaan telah dimulai
Akhir dari metode permintaan
akhir utama
Mulailah metode pegangan
Mulailah metode pegangan
Mulailah metode pegangan
BACBACBACBACBACBACBACBACBABA
Akhir metode pegangan
CBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCB
Akhir metode pegangan
CCCCCCCCCCCC
Akhir metode pegangan
Dari hasil operasi, kita dapat melihat bahwa metode permintaan tidak menunggu metode pegangan dieksekusi sebelum dieksekusi, tetapi memanggil metode pegangan dan kembali ke metode permintaan sampai menjalankan berakhir. Oleh karena itu, setara dengan metode permintaan yang melewati pekerjaan mencetak sejumlah karakter tertentu yang akan dilakukan dengan metode pegangan, dan metode permintaan dapat menjalankan pernyataan lain dalam metode bodoh tanpa menunggu metode pegangan untuk diselesaikan. Ini juga memberi tahu kita bahwa ketika beberapa pekerjaan memakan waktu, utas baru dapat dimulai dalam mode ini untuk melakukan pemrosesan. Mode ini dapat diterapkan ke server, yang dapat mengurangi waktu respons server.
Jelaskan proses dan utasnya:
Perbedaan terbesar antara utas dan proses adalah apakah memori hidup berdampingan.
Setiap proses memiliki ruang memori independennya sendiri. Suatu proses tidak dapat membaca dan menulis memori proses lain tanpa otorisasi. Karena ruang memori proses tidak tergantung satu sama lain, suatu proses tidak perlu khawatir dihancurkan oleh proses lain.
Thread dapat hidup berdampingan. Satu utas menulis konten ke instance, dan utas lainnya dapat membaca konten instance. Karena banyak utas dapat mengakses instance yang sama, kita perlu memastikan bahwa ia melakukan mutex dengan benar.
Optimalisasi Desain Host:
1. Desain kelas host menggunakan antarmuka ThreadFactory di bawah paket java.util.concurrent
host kelas publik {public void request (final int count, final char c) {System.out.println ("Metode permintaan dimulai"); threadfactory.newthread (runnable baru () {@Overridepublic void run () {// todo auto-method yang dihasilkan stubelper.handle (count, c);}}}}} {}} {} {} {} {} (coT); berakhir ");}}Objek instantiasi host yang sesuai:
Host host = host baru (executors.defaultThreadFactory ());
Keuntungan dari desain ini adalah bahwa kode instance asli yang dibuat dengan baru tergantung pada kelas java.lang.thread, dan tidak dapat mengontrol bagian utas pembuatan, dan kurang dapat digunakan kembali. Jika ThreadFactory digunakan untuk menyimpan objek dari kelas yang sesuai dan memanggil metode NewThread untuk membuat utas baru, pembuatan utas direalisasikan. Ini tidak lagi tergantung pada kelas utas, tetapi tergantung pada objek ThreadFactory yang diteruskan di konstruktor, yang mengimplementasikan rincian mengendalikan pembuatan utas.
Mendesain ulang kelas host menggunakan antarmuka java.util.concurrent.executor:
Antarmuka ThreadFactory sebelumnya menyembunyikan detail pembuatan utas, tetapi tidak menyembunyikan operasi pembuatan utas. Jika antarmuka pelaksana digunakan, operasi pembuatan utas juga akan disembunyikan.
public class Host{private final Helper helper = new Helper();private final Executor executor;public Host(Executor executor){this.executor = executor;}public void request(final int count,final char c){System.out.println("request method has started");executor.execute(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubhelper.handle (count, c);}}); System.out.println ("Metode permintaan akhir");}}Dibuat Menggunakan Java.util.concurrent.scheduledExecutorService Class, yang dapat menerapkan operasi yang dijadwalkan
public class Host{private final Helper helper = new Helper();private final ScheduledExecutorService scheduledExecutorService;public Host(ScheduledExecutorService scheduledExecutorService){this.scheduledExecutorService = scheduledExecutorService;}public void request(final int count,final char c){System.out.println("request method has Dimulai "); STECTEREDEXECUTORSERVICE.SCHEDULE (runnable baru () {@Overridepublic void run () {// TODO METODE AUTO-AUTOLETATED StubHelper.Handle (Count, C);}}, 3L, timeunit.seconds); System.out.println (" ENDEK end ";Uji entri fungsi utama:
Terjadwal ExecutorService Dijadwalkan ExecutorService = Executors.newscheduledThreadPool (5); Host Host = Host Baru (Jadwal ExecutorService); coba {host.request (10, 'a'); host.restquest (20, 'b'); host.request (30, 'c'); blocke.printstacktrace ();} akhirnya {scheduledExecutorService.shutdown (); system.out.println ("end utama");}Meringkaskan
Peran klien memanggil metode permintaan peran host, dan pemrosesan permintaan yang sebenarnya diserahkan ke pegangan pembantu untuk dieksekusi. Namun, jika klien memanggil metode pegangan langsung dari permintaan, itu tidak dapat dikembalikan dari metode pegangan sampai operasi yang sebenarnya selesai. Ini akan mengurangi kinerja respons permintaan. Oleh karena itu, peran host akan memulai utas baru yang digunakan untuk memproses permintaan dari peran klien dan membiarkan utas memanggil pegangan, sehingga utas yang membuat permintaan dapat segera kembali dari pegangan. Ini adalah mode utas per-pesan.