บทความนี้แบ่งปันรหัสเฉพาะสำหรับ Java เพื่อใช้ฟังก์ชั่นคว้าซองจดหมายสีแดงสำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
แนวคิดสำคัญ:
1. การคว้าซองจดหมายสีแดงเกี่ยวข้องกับการดำเนินการพร้อมกันสำหรับหลาย ๆ คนและจำเป็นต้องมีการซิงโครไนซ์เพื่อให้แน่ใจว่าผลการดำเนินการแบบมัลติเธรดนั้นถูกต้อง
2. เนื่องจากผู้คนจำนวนมากออนไลน์ในเวลาเดียวกันจากมุมมองของประสิทธิภาพผู้เล่นไม่จำเป็นต้องตอบสนองในเวลาที่เหมาะสมในการส่งคำขอซองจดหมายสีแดง แต่เซิร์ฟเวอร์จะดำเนินการคิวซองสีแดงเป็นประจำ
ต่อไปนี้เป็นรหัสหลักและคำอธิบายตรรกะการใช้งาน
1. สร้างคลาสเพื่อแสดงแนวคิดเอนทิตีของซองจดหมายสีแดง ใช้ตัวแปรอะตอมโดยตรงเพื่อให้แน่ใจว่าการซิงโครไนซ์ของการเพิ่มและลดลง ตัวแปรอะตอมของ Java เป็นกลไกการซิงโครไนซ์ที่ละเอียดยิ่งขึ้น ในสถานการณ์ที่มีการแข่งขันสูงประสิทธิภาพของการล็อคจะเกินประสิทธิภาพของตัวแปรอะตอม แต่ในสถานการณ์การแข่งขันที่สมจริงยิ่งขึ้นตัวแปรอะตอมจะมีประสิทธิภาพที่ดีขึ้น
Public Class SpringGift {บทบาทสตริงส่วนตัว; ของขวัญ Atomicinteger ส่วนตัว สตริงสาธารณะ getrole () {บทบาทคืน; } โมฆะสาธารณะ setrole (บทบาทสตริง) {this.role = บทบาท; } Public Atomicinteger GetGift () {คืนของขวัญ; } โมฆะสาธารณะ setGift (ของขวัญ Atomicinteger) {this.gift = ของขวัญ; } สาธารณะ int getRemainCount () {return this.gift.get (); - 2. ใช้การจำลองแบบมัลติเธรดเพื่อคว้าซองจดหมายสีแดงในเวลาเดียวกัน เซิร์ฟเวอร์บันทึกซองจดหมายสีแดงที่ส่งโดยผู้เล่นในคิวจากนั้นใช้งานเพื่อผลักดันข้อมูลซองจดหมายสีแดงไปยังผู้เล่นเป็นประจำ คำขอคว้าซองจดหมายสีแดงสำหรับผู้เล่นแต่ละชุดจะดำเนินการจริงโดยองค์ประกอบซองจดหมายสีแดงตัวแรกโผล่ขึ้นมาจากคิว แต่เมื่อจำนวนซองจดหมายสีแดงว่างเปล่าปัจจุบันซองจดหมายสีแดงถัดไปจะปรากฏขึ้นโดยอัตโนมัติ (ถ้ามี)
การทดสอบระดับสาธารณะ {สาธารณะคงที่พร้อมกันกับการเชื่อมโยงกับคิว <pringgift> คิว; สาธารณะสปริงสปริงคัพริฟต์; Public Static Atomicinteger Count = New Atomicinteger (); คลาสคงที่ MyThread ใช้งาน runnable {public void run () {handleEvent (); }} โมฆะคงที่สาธารณะหลัก (String [] args) โยนข้อยกเว้น {queue = ใหม่ ConcurrentLinkedQueue <pringGift> (); สำหรับ (int i = 0; i <3; i ++) {Gift SpringGift = New SpringGift (); gift.setrole ("บทบาท"+i); gift.setGift (Atomicinteger ใหม่ (50)); queue.add (ของขวัญ); } MYTHREAD MYTHREAD = NEW MYTHREAD (); สำหรับ (int i = 0; i <1000; i ++) {เธรดใหม่ (MyThread) .start (); } system.err.println ("ได้รับทั้งหมด"+count.get ()); } private static springgift getGift () {// ป้องกันหลายเธรดจากการโผล่ออกมาคิวในเวลาเดียวกันซิงโครไนซ์ (คิว) {// ถ้าไม่มีล็อคจำนวนทั้งหมดที่พิมพ์ออกมาไม่ถูกต้อง! - - - if (currgift == null || currgift.getRemainCount () <= 0) {currgift = queue.poll (); }} ส่งคืน Currgift; } โมฆะคงที่สาธารณะ handleVent () {ลอง {SpringGift OBJ = getGift (); if (obj == null || obj.getRemainCount () <= 0) {system.err.println ("ไม่"); กลับ ; } if (obj! = null && obj.getGift (). getandDecrement ()> 0) {system.err.println ("รับซองจดหมายสีแดง"); count.getandincrement (); } thread.sleep (500); // จำลองและกระบวนการดำเนินการอื่น ๆ } catch (exception e) {e.printstacktrace (); -ภาพหน้าจอของผลการทำงานมีดังนี้
ควรสังเกตว่าเนื่องจากวิธี getGift () จะปรากฏขึ้นโดยอัตโนมัติจะปรากฏองค์ประกอบส่วนหัวโดยอัตโนมัติกลไกการซิงโครไนซ์จะต้องทำ มิฉะนั้นเมื่อมีการร้องขอหลายครั้งที่เหลืออยู่สุดท้ายของซองจดหมายสีแดงบางแห่งในเวลาเดียวกันจำนวนซองจดหมายสีแดงทั้งหมดจะไม่ถูกต้อง
(หลังจากแสดงความคิดเห็นเกี่ยวกับรหัสล็อคคุณจะพบว่าจำนวนทั้งหมดของการพิมพ์อาจไม่ถูกต้อง!)
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น