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.
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.
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.
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:
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.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: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 bahawaTransferStack 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!