Есть ли поток прерывания Java асинхронной очереди и положить в оповещение? - PullRequest
0 голосов
/ 15 декабря 2018

Как и в приведенной ниже ссылке, есть ли Java-функция, которая прерывает поток асинхронной очереди и помещает в alerttable?

https://docs.microsoft.com/en-us/windows/desktop/sync/using-a-waitable-timer-with-an-asynchronous-procedure-call

Я хочу сделать функцию асинхронного таймера в Java.Я проверил это работает в C ++.Но я не знаю, если это в Java.Когда основной поток запустится и периодически проверяйте, запущен ли асинхронный таймер, запустите его и вернитесь назад и запустите снова.Это то, что я хочу сделать.Конечно, при проверке срабатывания асинхронного таймера я буду использовать режим сна с предупреждением.

Я пытался найти его в Google, но не нашел.Заранее спасибо!

Ниже я хочу подробнее остановиться.

Предположим, что есть программа, которая получает запросы типа:

msg1 : msgname=aa1 to=sub1 waittime=1000 msgbody 
msg2 : msgname=aa2 to=sub2 waittime=2000 msgbody 
msg3 : msgname=aa3 to=sub1 waittime=3000 msgbody 
msg4 : msgname=aa3 to=sub1 msgbody . .

и программадолжен передавать каждое сообщение в sub1, sub2, описанное в сообщении в поле.

Если время ожидания существует, оно должно передать сообщение столько же, сколько и в миллисекунде времени ожидания.программа должна сделать это в 1 поток, и там более 10 тысяч сообщений в секунду.Если использовать только синхронный сон, все сообщения не будут проходить через некоторое время и будут задержаны.Я проверяю, что это хорошо работает в коде c ++, и я видел коммерческую программу, созданную на Java (возможно), которая делает это.Но я новичок в Java, и я хочу знать, что это возможно в Java.

1 Ответ

0 голосов
/ 15 декабря 2018

Java не имеет концепций, аналогичных Windows «alerttable» и очереди APC, и я сомневаюсь, что можно было бы использовать оба нативных API-интерфейса Windows и , интегрирующих это с нормальным поведением потока Java.

Простой способ реализовать таймеры в Java - использовать стандартный класс Timer;см. Javadoc .Если это не сработает для вас, пожалуйста, объясните вашу проблему более подробно.


В ответ на вашу проблему продолжения: да, это возможно в Java.По факту.Есть, вероятно, много способов сделать это.Но Timer и TimerTask хороший способ, как и любой другой.Как то так:

   public class MyTask extends TimerTask {
       private String msg;
       private String to;
       public Mytask(String msg, String to) {
          this.msg = msg;
          this.to = to;
       }

       public void run() {
           // process message
       }
   }

   Timer timer = new Timer();

   while (...) {
       // read message
       timer.schedule(new MyTask(msg, to), waitTime);
   }
...