1. Semaphore
Mari kita bicara tentang Semaphore dulu. Semaphore dapat mengontrol jumlah sumber daya yang dapat diakses secara bersamaan, mendapatkan lisensi melalui Acquire (), tunggu jika tidak ada, dan rilis () melepaskan lisensi. Ini umumnya digunakan untuk mengontrol jumlah utas bersamaan dan pengecualian timbal balik antara utas. Selain itu, reentrantlock juga dapat mengimplementasikan fungsi ini, tetapi implementasinya lebih rumit.
Fungsinya mirip dengan semua 5 lubang di toilet. Jika 10 orang harus pergi ke toilet, lalu berapa banyak orang yang hanya bisa pergi ke toilet secara bersamaan? Pada saat yang sama, hanya 5 orang yang bisa mendudukinya. Ketika salah satu dari lima orang bergerak ke samping, salah satu dari 5 orang lain yang menunggu dapat menempatinya. Selain itu, di antara 5 orang yang menunggu, mereka bisa mendapatkan peluang prioritas secara acak, atau mereka bisa mendapatkan peluang dalam urutan pertama datang dan kemudian tiba.
Objek semaphore tunggal dapat mengimplementasikan fungsi mutex, dan dapat diperoleh dengan satu utas dan dirilis oleh utas lain. Ini dapat diterapkan dalam beberapa kasus pemulihan kebuntuan.
contoh:
/** * @description: * @param @param args * @return void type return */public static void main (string [] args) {// thread pool executorService exec = executors.newcachedthreadpool (); // Hanya 5 utas yang dapat mengakses semaphore akhir SEMP = SEMAPHORE baru (5); // Simulasikan 20 akses klien untuk (int index = 0; index <20; index ++) {final int no = index; Runnable run = new runnable () {public void run () {coba {// Dapatkan izin Semp.Acquire (); System.out.println ("Dapatkan akses:" + tidak); Thread.sleep ((long) (math.random () * 10000)); // Setelah mengakses, lepaskan Semp.Release (); System.out.println ("tetap tersedia Sinyal ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Hasil output (pikirkan mengapa output seperti ini):
Dapatkan akses: 1 Dapatkan akses: 5 Dapatkan akses: 2 Dapatkan akses: 3 Dapatkan akses: 0 Tersisa Tersisa Sinyal -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 13 Sinyal yang tersisa ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2. Gunakan pipa sebagai jembatan di antara benang
Pipa memiliki saluran sumber dan saluran wastafel. Data akan ditulis ke saluran wastafel dan dibaca dari saluran sumber. Satu di dalam dan satu keluar. Pertama mari kita pelajari cara menggunakannya.
Perlu dicatat bahwa di bawah java.nio.channels, kelas ini menunjukkan bahwa metode komunikasi data dari metode NIO digunakan, jadi gunakan buffer untuk buffer data.
Ilustrasi Prinsip Pipa:
Pipa adalah pipa kosong. Salah satu ujung pipa kosong ini dapat dibaca dari bagian dalam pipa dan ujung lainnya dapat ditulis ke dalam pipa.
Proses Operasi:
1. Pertama, harus ada objek untuk menulisnya ke dalam tabung kosong ini. Dimana harus menulis? Pipa kosong ini memiliki sedikit ruang, tepat di pipa ini.
Saat menulis, itu ditulis ke dalam ruang yang terkandung dalam pipa itu sendiri. Ukuran ruang ini adalah 1024 byte.
2. Kemudian objek lain dapat membacakan isi tabung yang diisi ini.
Pada kode
Paket com.jx.test; impor java.io.ioException; impor java.nio.bytebuffer; import java.nio.channels.pipe; class public testpipe {/** * @description: @param @param args * @return void tipe pengembalian * @THROWS ioException * @param {public @return void tipe pengembalian * @Throws ioException * @param/@return void tipe pengembalian * @Throws ioException * Buat pipa pipa pipa = pipa.open (); pipa akhir. {System.out.println ("Kirim ......"); // Buat utas dan gunakan pipa port write pipa. Tipe Channel PSIC untuk menulis konten bytebuffer yang ditentukan ke dalam pipa int res = psic.write ("BytEbuffer .wrap (" Hello, Pipe! Communication ... " res);}catch (Exception e) {e.printStackTrace();}}};Thread tPreader = new Thread() {public void run() {int bbufferSize = 1024 * 2;ByteBuffer bbuffer = ByteBuffer.allocate(bbufferSize);try {System.out.println("recive......");// Create a thread and use the read Entri pipa pipa. Sourcechannel Tipe PSOC Untuk membaca konten dalam pipa ke dalam bytebuffer yang ditentukan int res = psoc.read (bbuffer); // data bukan system.out.println ("ukuran recive:"+res+"konten:"+bytebufferTostring (bbuffer); {E.PrintStackTrace ();}}}; tpwriter.start (); tpreader.start ();}/***byteBuffer-> fungsi konversi string*/public static string bytebufferToString (bytebuffer) {if (if content == Content || Content.| content.remaining())) {System.out.println("Not exists or the content is empty!");return null;}int contentSize = content.limit() - content.remaining();StringBuffer resultStr = new StringBuffer();for (int i = 0; i < contentSize; i += 2) {resultStr.append(content.getchar(i));}return HasilTR.ToString ();}}Meringkaskan
Di atas adalah semua tentang contoh-contoh komunikasi antar-utara pemrograman Java dan kode semaphore dalam artikel ini, 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!