Обновите строку на N секунд в цикле while - PullRequest
0 голосов
/ 19 сентября 2018

Я только начал изучать Java, и я застрял в этой проблеме: у меня бесконечный цикл while, который создает сообщение для отправки через сокет;в настоящее время сообщение не отправляется до тех пор, пока несколько элементов не будут опрошены из очереди и не прочитают их.

String msg = null;
String toSend = "";
String currentNumOfMsg = 0;
String MAX_MSG_TO_SEND = 200;
while(true) {
    if ((msg = messageQueue.poll()) != null) { // if there is an element in the list
        toSend += (msg + "#");
        currentNumOfMsg++;

        if (currentNumOfMsg == MAX_MSG_TO_SEND) {
            try {   
                sendMessage(toSend); // send to socket
            } finally {
                msg = null;
                toSend = "";
                currentNumOfMsg = 0;
            }
        }
    }
}

Моя цель - отправить сообщение через N секунд, не дожидаясь достижения MAX_MSG_TO_SEND ...Можно ли это сделать или я продолжу этот подход?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Хотя другой ответ совершенно верен, я подумал, что было бы полезно сообщить вам, что ScheduledExecutorService (документация найдена здесь ) позволяет вам вызывать функцию foo() каждые n секунд, используяметод scheduleAtFixedRate().

По сути, фактическая настройка исполнителя так же проста, как:

ScheduledExecutorService ses = Executors.newScheduledThreadPool(1);
ses.scheduleAtFixedRate(foo, 0, n, TimeUnit.SECONDS); 

Я думаю, что вводить здесь дополнительный код немного ненужно, но чтобы узнать, как это сделать более подробнопосмотрите здесь , здесь или здесь .Эти ссылки дают несколько основных примеров.Я действительно рекомендовал бы делать это таким образом, так как этот класс является частью библиотеки утилит java (поэтому никаких дополнительных зависимостей), и вам на самом деле не нужно сильно беспокоиться о его многопоточности / планировании, он позаботится обо всем этом.для тебя.Но это только мои $ .02.

Оставьте вопрос / комментарий, если он у вас есть, я постараюсь на него ответить.

0 голосов
/ 19 сентября 2018

Да, определенно вы можете сделать такую ​​вещь.Но сначала вы должны хранить ваши принимаемые сообщения в структуре данных, а когда вы хотите отправить данные через сокет, отправьте данные в структуре данных.

также вы можете использовать guava stopWatch для отправки сообщения точно в срок.для получения дополнительной информации вы можете увидеть https://dzone.com/articles/guava-stopwatch

В противном случае вы можете использовать длинную переменную, которая хранит System.currentTimeMillis () и каждый раз проверяет, получено ли ожидаемое истекшее время или нет, как показано в примере кода ниже:

long l = System.currentTimeMillis();
if(System.currentTimeMillis() - l >= 10000) {
    //send data
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...