توضح هذه المقالة طريقة معالجة التأخير بعد التحكم في التدفق JAVA والتحكم الفائق في التدفق. شاركها مع الجميع لتكون مرجعا لك. طريقة التنفيذ المحددة هي كما يلي:
فحص التحكم في التدفق (يتم تجميعه كل نصف ثانية، لذا يمكن أن يكون الحد الأدنى الفارغ عنصرين فقط في الثانية):
انسخ الكود كما يلي: import java.text.SimpleDateFormat;
import java.util.Date;
import java.lang.Thread;
/**
* التحكم في التدفق
*
* @author chenx
*/
الطبقة العامة OverflowController {
Private int maxSendCountPerSecend; // عتبة التحكم في التدفق على هذا الرابط
تاريخ خاص sendTime = تاريخ جديد ()؛
Private int sendCount = 0; // الرقم المرسل على هذا الرابط
OverflowController العامة (int maxSendCountPerSecend) {
إذا (maxSendCountPerSecend < 2) {
maxSendCountPerSecend = 2;
}
this.maxSendCountPerSecend = maxSendCountPerSecend;
}
كثافة العمليات العامة getMaxSendCountPerSecend() {
إذا (getMillithans(new Date()) >= 500) {
إرجاع maxSendCountPerSecend / 2؛
}
إرجاع maxSendCountPerSecend - (maxSendCountPerSecend / 2);
}
/**
* سواء كان التحكم الفائق في التدفق
*/
isOverflow المنطقي العام (int sendNum) {
متزامن (هذا) {
التاريخ الآن = تاريخ جديد ()؛
إذا (now.getTime() - sendTime.getTime() >= 500) {
sendTime = now;
sendCount = sendNum;
} آخر {
إذا (sendCount + sendNum > getMaxSendCountPerSecend()) {
عودة صحيحة؛
} آخر {
sendCount += sendNum;
}
}
عودة كاذبة.
}
}
/**
* الحصول على عدد المللي ثانية في الوقت المحدد
*/
int الخاص getMillithans(تاريخ التاريخ) {
SimpleDateFormat df = new SimpleDateFormat("SSS");
return Integer.valueOf(df.format(date));
}
public static void main(String[] args) يلقي InterruptedException {
OverflowController oc = new OverflowController(50);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
لـ (int i = 0; i <= 100; i++) {
إذا (oc.isOverflow(1)) {
System.out.println(i + "-isOverflow-" + df.format(new Date()));
} آخر {
System.out.println(i + "-sendOk-" + df.format(new Date()));
}
Thread.sleep(10);
}
}
}
تأخير المعالجة بعد التحكم الفائق في التدفق، لأنه لا يوجد "تفويض تأخير" لـ .net في Java:
انسخ الكود كما يلي: ThreadPool.RegisterWaitForSingleObject(
انتظر التعامل مع كائن الانتظار,
WaitOrTimerCallback رد الاتصال،
حالة الكائن،
int مللي ثانيةTimeOutInterval,
تنفيذ منطقي فقط مرة واحدة
)
يجب تنفيذ قائمة انتظار تأخير بسيطة في Java:
انسخ الكود كما يلي: import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
الطبقة العامة DelayEntry تنفذ Delayed {
عدد صحيح خاص؛
وقت dequeuedTimeMillis الخاص الطويل؛
كثافة العمليات العامة getCount() {
عدد الإرجاع؛
}
مجموعة الفراغ العام (عدد العمليات) {
this.count = count;
}
public long getDequeuedTimeMillis() {
إرجاع قائمة الانتظار TimeMillis؛
}
DelayEntry العام (تأخير طويلMillis) {
dequeuedTimeMillis = System.currentTimeMillis() + DequeuedTimeMillis;
}
@تجاوز
كثافة العمليات العامة قارن إلى (تأخير س) {
DelayEntry de = (DelayEntry) o;
مهلة طويلة = dequeuedTimeMillis - de.dequeuedTimeMillis;
مهلة العودة > 0 ? : مهلة < 0 ?
}
@تجاوز
public long getDelay(وحدة TimeUnit) {
إرجاع dequeuedTimeMillis - System.currentTimeMillis();
}
}
انسخ الكود كما يلي: import java.util.concurrent.DelayQueue;
خدمة تأخير الطبقة العامة {
تشغيل الفراغ العام () {
DelayQueue<DelayEntry> queue = new DelayQueue<DelayEntry>();
DelayConsumer DelayConsumer = new DelayConsumer(queue);
DelayConsumer.start();
لـ (int i = 0; i < 100; i++) {
DelayEntry de = new DelayEntry(5000);
de.setCount(i);
System.out.println(System.currentTimeMillis() + "--------" + de.getCount());
queue.add(de);
}
}
فئة DelayConsumer تمتد الموضوع {
DelayQueue<DelayEntry> queue;
DelayConsumer العام (DelayQueue<DelayEntry> queue) {
this.queue = queue;
}
تشغيل الفراغ العام () {
بينما (صحيح) {
يحاول {
DelayEntry de = queue.take();
System.out.println("queue size=" + queue.size());
System.out.println(de.getCount());
System.out.println(System.currentTimeMillis());
} قبض على (InterruptedException e) {
printStackTrace();
}
}
}
}
public static void main(String[] args) {
DelayService ds = new DelayService();
ds.run();
}
}
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.