在while循环中将字符串更新N秒

时间:2018-09-19 13:19:31

标签: java sockets while-loop

我刚刚开始学习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 :(得分:2)

虽然其他答案完全正确,但我认为告诉您ScheduledExecutorService(找到的文档here)可以让您每{{1 }}秒,使用方法foo()

基本上,实际设置执行程序很容易:

n

我认为在此处添加更多代码是不必要的,但是要了解如何更详细地执行此操作,请查看hereherehere。这些链接提供了一些基本示例。我真的建议这样做,因为该类是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
}