この記事では、JAVAフロー制御とスーパーフロー制御後の遅延処理方法について説明します。皆さんの参考に共有してください。具体的な実装方法は以下の通りです。
フロー制御チェック (0.5 秒ごとに蓄積されるため、最小ブランクしきい値は 1 秒あたり 2 項目のみになります):
次のようにコードをコピーします。
java.util.Dateをインポートします。
java.lang.Threadをインポートします。
/**
* フロー制御
*
* @著者チェンクス
*/
パブリック クラス OverflowController {
private int maxSendCountPerSecend; // このリンクのフロー制御しきい値
private Date sendTime = new Date();
private int sendCount = 0; このリンクで送信される数
public OverflowController(int maxSendCountPerSecend) {
if (maxSendCountPerSecend < 2) {
maxSendCountPerSecend = 2;
}
this.maxSendCountPerSecend = maxSendCountPerSecend;
}
public int getMaxSendCountPerSecend() {
if (getMilliseconds(new Date()) >= 500) {
maxSendCountPerSecend / 2 を返します。
}
maxSendCountPerSecend - (maxSendCountPerSecend / 2) を返します。
}
/**
※スーパーフローコントロールかどうか
*/
public boolean isOverflow(int sendNum) {
同期された (これ) {
現在の日付 = new Date();
if (now.getTime() - sendTime.getTime() >= 500) {
sendTime = 今;
sendCount = 送信番号;
} それ以外 {
if (sendCount + sendNum > getMaxSendCountPerSecend()) {
true を返します。
} それ以外 {
sendCount += sendNum;
}
}
false を返します。
}
}
/**
* 指定された時間のミリ秒数を取得します
*/
private int getMilliseconds(Date date) {
SimpleDateFormat df = new SimpleDateFormat("SSS");
return Integer.valueOf(df.format(date));
}
public static void main(String[] args) throws InterruptedException {
オーバーフローコントローラー oc = 新しいオーバーフローコントローラー(50);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
for (int i = 0; i <= 100; i++) {
if (oc.isOverflow(1)) {
System.out.println(i + "-isOverflow-" + df.format(new Date()));
} それ以外 {
System.out.println(i + "-sendOk-" + df.format(new Date()));
}
Thread.sleep(10);
}
}
}
Java には .net の「遅延委任」がないため、スーパー フロー制御後の処理が遅延します。
次のようにコードをコピーします。 ThreadPool.RegisterWaitForSingleObject(
WaitHandle 待機オブジェクト、
WaitOrTimerCallbackコールバック、
オブジェクトの状態、
int ミリ秒TimeOutInterval、
ブール型executeOnlyOnce
)
単純な遅延キューを Java で実装する必要があります。
次のようにコードをコピーします。
java.util.concurrent.TimeUnitをインポートします。
public class DelayEntry は Delayed {を実装します。
プライベート int カウント;
private long dequeuedTimeMillis // デキュー時間;
public int getCount() {
戻り数;
}
public void setCount(int count) {
this.count = カウント;
}
public long getDequeuedTimeMillis() {
デキューされたTimeMillisを返します。
}
public DelayEntry(長い遅延ミリス) {
dequeuedTimeMillis = System.currentTimeMillis() + lateMillis;
}
@オーバーライド
public int CompareTo(遅延o) {
DelayEntry de = (DelayEntry) o;
長いタイムアウト = dequeuedTimeMillis - de.dequeuedTimeMillis;
タイムアウト > 0 ? 1 : タイムアウト < 0 ? : 0;
}
@オーバーライド
public long getDelay(TimeUnit 単位) {
デキューされたTimeMillisを返す - System.currentTimeMillis();
}
}
次のようにコードをコピーします。
パブリック クラス DelayService {
public void run() {
DelayQueue<DelayEntry> キュー = new DelayQueue<DelayEntry>();
DelayConsumer 遅延コンシューマ = 新しい DelayConsumer(キュー);
遅延Consumer.start();
for (int i = 0; i < 100; i++) {
DelayEntry de = new DelayEntry(5000);
de.setCount(i);
System.out.println(System.currentTimeMillis() + "--------" + de.getCount());
queue.add(de);
}
}
class DelayConsumer extends Thread {
DelayQueue<DelayEntry> キュー。
public DelayConsumer(DelayQueue<DelayEntry> キュー) {
this.queue = キュー;
}
public void run() {
while (true) {
試す {
DelayEntry de = queue.take();
System.out.println("キュー サイズ=" + queue.size());
System.out.println(de.getCount());
System.out.println(System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
DelayService ds = new DelayService();
ds.run();
}
}
この記事が皆さんの Java プログラミングに役立つことを願っています。