В этой статье описывается метод обработки задержки после управления потоком JAVA и управления суперпотоком. Поделитесь этим со всеми для справки. Конкретный метод реализации заключается в следующем:
Проверка управления потоком (накапливается каждые полсекунды, поэтому минимальный порог пропуска может составлять только 2 элемента в секунду):
Скопируйте код следующим образом: import java.text.SimpleDateFormat;
импортировать java.util.Date;
импортировать java.lang.Thread;
/**
* Контроль потока
*
* @author chenx
*/
общественный класс OverflowController {
Private int maxSendCountPerSecend // Порог управления потоком по этой ссылке;
частная дата sendTime = новая дата();
Private int sendCount = 0 // Число, отправленное по этой ссылке;
общественный OverflowController (int maxSendCountPerSecend) {
если (maxSendCountPerSecend <2) {
МаксСендКаунтПерСекенд = 2;
}
this.maxSendCountPerSecend = maxSendCountPerSecend;
}
public int getMaxSendCountPerSecend () {
if (getMilli Seconds(new Date()) >= 500) {
вернуть maxSendCountPerSecend/2;
}
вернуть maxSendCountPerSecend - (maxSendCountPerSecend/2);
}
/**
* Будь то суперконтроль потока
*/
общедоступное логическое значение isOverflow(int sendNum) {
синхронизировано (это) {
Дата сейчас = новая дата();
if (now.getTime() - sendTime.getTime() >= 500) {
sendTime = сейчас;
sendCount = sendNum;
} еще {
if (sendCount + sendNum > getMaxSendCountPerSecend()) {
вернуть истину;
} еще {
sendCount + = sendNum;
}
}
вернуть ложь;
}
}
/**
* Получить количество миллисекунд за указанное время
*/
частный int getMilli Seconds (Дата Дата) {
SimpleDateFormat df = новый SimpleDateFormat("SSS");
return Integer.valueOf(df.format(date));
}
public static void main(String[] args) выдает InterruptedException {
OverflowController oc = новый OverflowController(50);
SimpleDateFormat df = new SimpleDateFormat("гггг-ММ-дд ЧЧ:мм:сс:ССС");
for (int я = 0; я <= 100; я++) {
если (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 waitObject,
WaitOrTimerCallback обратный вызов,
Состояние объекта,
int миллисекундыTimeOutInterval,
bool выполнитьOnlyOnce
)
На Java необходимо реализовать простую очередь задержки:
Скопируйте код следующим образом: import java.util.concurrent.Delayed;
импортировать java.util.concurrent.TimeUnit;
публичный класс DelayEntry реализует Delayed {
частный счетчик int;
Private long dequeuedTimeMillis // время удаления из очереди;
общественный int getCount() {
счетчик возврата;
}
public void setCount(int count) {
this.count = количество;
}
public long getDequeuedTimeMillis() {
вернуть dequeuedTimeMillis;
}
public DelayEntry (длинная задержкаMillis) {
dequeuedTimeMillis = System.currentTimeMillis() + задержкиMillis;
}
@Override
public int CompareTo(Delayed o) {
DelayEntry de = (DelayEntry) о;
длинный тайм-аут = dequeuedTimeMillis - de.dequeuedTimeMillis;
тайм-аут возврата > 0 1: тайм-аут < 0 ? -1: 0;
}
@Override
public long getDelay (единица TimeUnit) {
return dequeuedTimeMillis - System.currentTimeMillis();
}
}
Скопируйте код следующим образом: import java.util.concurrent.DelayQueue;
общественный класс DelayService {
общественный недействительный запуск () {
Очередь DelayQueue<DelayEntry> = новая DelayQueue<DelayEntry>();
DelayConsumer задержкиConsumer = новый DelayConsumer (очередь);
задержкаConsumer.start();
для (int я = 0; я <100; я++) {
DelayEntry de = новый DelayEntry (5000);
de.setCount(я);
System.out.println(System.currentTimeMillis() + "--------" + de.getCount());
очередь.добавить(де);
}
}
класс DelayConsumer расширяет поток {
очередь DelayQueue<DelayEntry>;
public DelayConsumer (DelayQueue<DelayEntry> очередь) {
this.queue = очередь;
}
общественный недействительный запуск () {
в то время как (истина) {
пытаться {
DelayEntry de =queue.take();
System.out.println("размер очереди=" + очередь.размер());
System.out.println(de.getCount());
System.out.println(System.currentTimeMillis());
} catch (InterruptedException e) {
е.printStackTrace();
}
}
}
}
public static void main(String[] args) {
DelayService ds = новый DelayService();
ds.run();
}
}
Я надеюсь, что эта статья будет полезна каждому, кто занимается программированием на Java.