บทความนี้อธิบายวิธีการประมวลผลล่าช้าหลังจากการควบคุมการไหลของ JAVA และการควบคุมการไหลขั้นสูง แบ่งปันกับทุกคนสำหรับการอ้างอิงของคุณ วิธีการดำเนินการเฉพาะมีดังนี้:
การตรวจสอบการควบคุมการไหล (สะสมทุกครึ่งวินาที ดังนั้นเกณฑ์ว่างขั้นต่ำสามารถเป็นได้เพียง 2 รายการต่อวินาที):
คัดลอกโค้ดดังต่อไปนี้: import java.text.SimpleDateFormat;
นำเข้า java.util.Date;
นำเข้า java.lang.Thread;
-
* การควบคุมการไหล
-
* @ผู้เขียน chenx
-
OverflowController ระดับสาธารณะ {
int maxSendCountPerSecend; // เกณฑ์การควบคุมโฟลว์ในลิงก์นี้
วันที่ส่วนตัว sendTime = วันที่ใหม่ ();
private int sendCount = 0; //หมายเลขที่ส่งไปที่ลิงค์นี้
OverflowController สาธารณะ (int maxSendCountPerSecend) {
ถ้า (maxSendCountPerSecend < 2) {
maxSendCountPerSecend = 2;
-
this.maxSendCountPerSecend = maxSendCountPerSecend;
-
int สาธารณะ getMaxSendCountPerSecend () {
ถ้า (getMilliseconds(วันที่ใหม่()) >= 500) {
กลับ maxSendCountPerSecend / 2;
-
ส่งคืน maxSendCountPerSecend - (maxSendCountPerSecend / 2);
-
-
* ไม่ว่าจะเป็นการควบคุมการไหลแบบซุปเปอร์โฟลว์
-
บูลีนสาธารณะ isOverflow (int sendNum) {
ซิงโครไนซ์ (สิ่งนี้) {
วันที่ตอนนี้ = วันที่ใหม่ ();
ถ้า (now.getTime() - sendTime.getTime() >= 500) {
sendTime = ตอนนี้;
sendCount = sendNum;
} อื่น {
ถ้า (sendCount + sendNum > getMaxSendCountPerSecend()) {
กลับเป็นจริง;
} อื่น {
sendCount += sendNum;
-
-
กลับเท็จ;
-
-
-
* รับจำนวนมิลลิวินาทีในเวลาที่กำหนด
-
int getMilliseconds ส่วนตัว (วันที่) {
SimpleDateFormat df = SimpleDateFormat ใหม่ ("SSS");
กลับ Integer.valueOf(df.format(date));
-
โมฆะคงสาธารณะ main (String [] args) พ่น InterruptedException {
OverflowController oc = OverflowController ใหม่ (50);
SimpleDateFormat df = SimpleDateFormat ใหม่ ("yyyy-MM-dd HH:mm:ss:SSS");
สำหรับ (int i = 0; i <= 100; i++) {
ถ้า (oc.isOverflow(1)) {
System.out.println(i + "-isOverflow-" + df.format(วันที่ใหม่()));
} อื่น {
System.out.println(i + "-sendOk-" + df.format(วันที่ใหม่()));
-
เธรด.สลีป(10);
-
-
-
การประมวลผลล่าช้าหลังจากการควบคุม super flow เนื่องจากไม่มี "การมอบหมายความล่าช้า" ของ .net ใน Java:
คัดลอกรหัสดังต่อไปนี้: ThreadPool.RegisterWaitForSingleObject(
รอจัดการรอวัตถุ
WaitOrTimerCallback โทรกลับ
สถานะของวัตถุ
int มิลลิวินาทีTimeOutInterval,
บูลดำเนินการOnlyOnce
-
จำเป็นต้องใช้คิวการหน่วงเวลาอย่างง่ายใน Java:
คัดลอกรหัสดังต่อไปนี้: import java.util.concurrent.Delayed;
นำเข้า java.util.concurrent.TimeUnit;
DelayEntry ระดับสาธารณะดำเนินการล่าช้า {
จำนวน int ส่วนตัว
dequeuedTimeMillis ส่วนตัวยาว // เวลา dequeued
สาธารณะ int getCount() {
การนับผลตอบแทน;
-
setCount สาธารณะเป็นโมฆะ (จำนวน int) {
this.count = นับ;
-
getDequeuedTimeMillis สาธารณะยาว () {
กลับ dequeuedTimeMillis;
-
DelayEntry สาธารณะ (delayMillis ยาว) {
dequeuedTimeMillis = System.currentTimeMillis() + DelayMillis;
-
@แทนที่
int สาธารณะเปรียบเทียบถึง (ล่าช้า o) {
DelayEntry เดอ = (DelayEntry) o;
การหมดเวลานาน = dequeuedTimeMillis - de.dequeuedTimeMillis;
กลับหมดเวลา > 0 ? 1 : หมดเวลา < 0 ? -1 : 0;
-
@แทนที่
getDelay ยาวสาธารณะ (หน่วยหน่วยเวลา) {
กลับ dequeuedTimeMillis - System.currentTimeMillis();
-
-
คัดลอกรหัสดังต่อไปนี้: import java.util.concurrent.DelayQueue;
DelayService ระดับสาธารณะ {
โมฆะสาธารณะวิ่ง () {
DelayQueue<DelayEntry> คิว = ใหม่ DelayQueue<DelayEntry>();
DelayConsumer DelayConsumer = DelayConsumer ใหม่ (คิว);
ล่าช้าConsumer.start();
สำหรับ (int i = 0; i < 100; i++) {
DelayEntry de = ใหม่ DelayEntry(5000);
de.setCount(i);
System.out.println(System.currentTimeMillis() + "--------" + de.getCount());
คิว.เพิ่ม(de);
-
-
คลาส DelayConsumer ขยายเธรด {
DelayQueue<DelayEntry> คิว;
DelayConsumer สาธารณะ (DelayQueue <DelayEntry> คิว) {
this.queue = คิว;
-
โมฆะสาธารณะวิ่ง () {
ในขณะที่ (จริง) {
พยายาม {
DelayEntry de = Queue.take();
System.out.println("ขนาดคิว = " + Queue.size());
System.out.println(de.getCount());
System.out.println(System.currentTimeMillis());
} จับ (InterruptedException e) {
e.printStackTrace();
-
-
-
-
โมฆะคงที่สาธารณะ main (String [] args) {
DelayService ds = DelayService ใหม่ ();
ds.run();
-
-
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน