我刚刚开始学习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 ...是否可以做到这一点,或者我将继续这种方法吗?
答案 0 :(得分:2)
虽然其他答案完全正确,但我认为告诉您ScheduledExecutorService
(找到的文档here)可以让您每{{1 }}秒,使用方法foo()
。
基本上,实际设置执行程序很容易:
n
我认为在此处添加更多代码是不必要的,但是要了解如何更详细地执行此操作,请查看here,here或here。这些链接提供了一些基本示例。我真的建议这样做,因为该类是java util库的一部分(因此没有额外的依赖项),并且您实际上不必担心它的多线程/调度部分,它可以解决所有这些问题为了你。但是,那只是我的$ .02。
如果有任何疑问或意见,我会尽力回答。
答案 1 :(得分:1)
是的,绝对可以做到这一点。但是首先,您应该将接收消息存储在数据结构中,并且当您想通过套接字发送数据时,请以数据结构发送数据。
此外,您可以使用guava stopWatch准确地按时发送消息。有关更多信息,请参见https://dzone.com/articles/guava-stopwatch
否则,您可以使用存储System.currentTimeMillis()的long变量,并每次检查是否收到预期的经过时间,如下面的示例代码:
long l = System.currentTimeMillis();
if(System.currentTimeMillis() - l >= 10000) {
//send data
}