Rumah  >  Artikel  >  Java  >  Apakah SynchronousQueue dalam java

Apakah SynchronousQueue dalam java

王林
王林ke hadapan
2023-04-30 13:04:181223semak imbas

Penerangan Fungsi

Untuk memahami SynchronousQueue, anda mesti terlebih dahulu mengetahui fungsinya Hanya dengan mengetahui tujuan kelas ini dan fungsi yang disediakannya, anda tidak akan tersesat apabila membaca sumbernya kod.

Dalam kajian kami sebelum ini, jika utas ingin menukar data, mereka biasanya menggunakan pembolehubah awam atau baris gilir penyekat segerak, utas pengeluar menetapkan pembolehubah atau meletakkan nilai ke dalam baris gilir, dan pengguna Benang membaca pembolehubah atau ambil daripada baris gilir.

SynchronousQueue tidak perlu menyimpan data yang ditukar antara benang Ia berfungsi lebih seperti pemadan untuk memadankan pengeluar dan pengguna satu demi satu.

Proses umum

Sebagai contoh, apabila benang memanggil kaedah put dan mendapati tiada benang ambil dalam baris gilir, benang put akan menyekat ambil benang masuk, didapati Jika terdapat benang put yang disekat, maka kedua-duanya akan sepadan, dan kemudian benang ambil akan memperoleh data benang put, dan tiada benang akan disekat.

Sebaliknya, utas yang memanggil kaedah ambil juga akan menyekat utas Apabila utas yang memanggil kaedah put masuk, ia juga akan sepadan dengannya.

Jika benang take or put masuk dan mendapati benang take or put dari jenis yang sama disekat, maka benang akan beratur ke belakang sehingga benang jenis lain masuk dan sepadan dengan salah satu utas .

Melalui penerangan proses, saya percaya bahawa saya mempunyai pemahaman tertentu tentang SynchronousQueue, dan saya juga tahu mengapa SynchronousQueue tidak perlu menyimpan elemen.

Analisis kod sumber

Dengan melihat kaedah ambil dan letak SynchronousQueue, kami mendapati bahawa kedua-duanya memanggil kaedah pemindahan pemindahan, atribut , dan atribut pemindah ialah Pemindah kelas dalaman statik Abstrak bagi SynchronousQueue. Pemindah mempunyai dua subkelas, TransferQueue dan TransferStack;

Dalam kaedah pembina SynchronousQueue, adil parameter yang diluluskan digunakan untuk menentukan sama ada untuk mencipta TransferQueue atau TransferStack Menurut parameter fair, TransferQueue hendaklah dalam mod adil TransferStack ialah mod tidak berfungsi.

Pelaksanaan TransferQueue mod adil

Pertama sekali, ia mempunyai QNode kelas dalaman Melalui analisis di atas, didapati mungkin terdapat berbilang pengguna atau berbilang pengeluar , dan mereka akan Membentuk baris gilir, dan QNode ialah senarai terpaut yang digunakan untuk membentuk baris gilir.

QNode terutamanya mempunyai empat atribut:

QNode seterusnya: mewakili nod seterusnya

Item objek di sini sebenarnya adalah data put, nod yang dihasilkan oleh kaedah ambil Di sini; is null;

Thread waiter; Benang yang disekat biasanya disekat oleh thread yang menghasilkan nod ini akan bangun selepas mendapat data

boolean isData: true bermaksud put generation ; false bermaksud ia dijana oleh ambil;

Memandangkan kedua-dua take dan put bergantung pada kaedah pemindahan, mari kita lihat pelaksanaan pemindahan terlalu panjang jadi saya tidak akan siarkan pada carta alir diringkaskan:

Apakah SynchronousQueue dalam java

Oleh kerana kaedah ini tidak menggunakan kunci untuk kawalan, masih terdapat banyak pertimbangan dalam keseluruhan proses Ini adalah yang utama dan proses utama.

Untuk menerangkan secara ringkas, keseluruhan proses bergantung pada senarai terpaut QNode isData of QNode membezakan kaedah take or put IsData bagi nod dalam senarai terpaut mestilah sama daripada QNode ialah urutan ambil dan letak Data yang ditukar, kecuali data yang ditukar dengan kaedah ambil adalah batal.

Dapat dilihat bahawa setiap kali ia boleh dipadankan, nod paling hadapan diambil dan data dikembalikan.

TransferStack mod tidak adil

Begitu juga TransferStack juga mempunyai struktur senarai terpaut yang dipanggil SNode Atribut utama SNode adalah seperti berikut:

SNode seterusnya: nod seterusnya;

Snod padan:

Nod yang berjaya dipadankan;

Pelayan thread:

Item objek: nilai yang akan diberikan ;

mod int: klasifikasi nod, digunakan untuk membezakan put atau take;

turut menyusun carta aliran kod sumber, seperti yang ditunjukkan di bawah:

Apakah SynchronousQueue dalam java

Ia juga dilaksanakan menggunakan senarai terpaut, tetapi yang ini mempunyai struktur yang berbeza Terdapat padanan tambahan untuk mewakili nod yang sepadan.

Melalui proses, anda boleh melihat bahawa mod mempunyai tiga nilai Selain 0 dan 1, terdapat juga 2 untuk mewakili nod yang dipadankan. Terutamanya dalam bahagian kotak merah dalam gambar di atas, apabila

mendapati bahawa nod kepala tidak sedang berjalan, benang semasa akan mencipta nod yang sepadan, kemudian menambahnya pada kepala, dan akhirnya memadankannya dengan nod berikut .

Jika padanan ditemui, nod yang sepadan akan dialih keluar daripada senarai terpaut.

Melalui analisis proses, dapat dilihat bahawa

TransferStack diletakkan di kepala utas yang masuk kemudian, dan akan dipadankan dahulu .

Atas ialah kandungan terperinci Apakah SynchronousQueue dalam java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam