当前位置: 首页 > 知识库问答 >
问题:

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

吕霍英
2023-03-14

我刚开始学习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个答案

季骏祥
2023-03-14

是的,你肯定能做这样的事。但首先,您应该将接收消息存储在数据结构中,当您想通过套接字发送数据时,请将数据发送到数据结构中。

此外,您可以使用番石榴秒表按时发送消息。有关更多信息,您可以查看 https://dzone.com/articles/guava-stopwatch

否则,您可以使用一个存储System.currentTimeMillis()的长变量,每次检查是否收到了预期的经过时间,如下例代码所示:

long l = System.currentTimeMillis();
if(System.currentTimeMillis() - l >= 10000) {
    //send data
}
鲁宏爽
2023-03-14

虽然另一个答案是完全有效的,但我认为告诉您ScheduledExecutorService(在此处找到留档)可能很有价值,它允许您使用方法schduleAtFixedrate()每隔n秒调用一个函数foo()

基本上,实际设置执行器很简单:

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

我认为在这里放入更多的代码是有点不必要的,但是要更详细地了解如何做到这一点,请看这里,这里,或者这里。这些链接给出了一些基本的例子。我真的建议这样做,因为这个类是java util库的一部分(所以没有额外的依赖性),你实际上不必太担心它的多线程/调度部分,它会为你处理所有的事情。但这只是我的0.02美元。

如果您有问题/评论,请留下问题/评论,我会尽力回答。

 类似资料:
  • 问题内容: 我被困在我应该声明一个称为“ phrase”的字符串变量的部分,该变量不应一直循环播放。 让您知道我的任务是:与选项1相似,不同之处在于用户在输入第一队的结果后输入“ N”(而不是“ Q”)。然后,程序输入第二个团队名称及其结果,直到输入“ Q”。输出两个语句,例如选项1中的语句,然后输出第三条语句,该语句说明哪个团队处于第一位(基于点数) 输入样例: 样本输出: 更新 : 我的代码:

  • 我正在尝试制作一个计算某人所做步数的程序(如果这个数字更大或等于10000,程序就应该停止),但我似乎找不到一种方法来键入“回家”,然后输入到家所必需的步数。

  • 我正在尝试制作一个神奇的8球,为除“再见”以外的任何输入提供随机预设答案。每次调用 void 函数 magic8ball() 时,它都会生成一个 0 - 19 之间的随机数,并将相应的响应输出到控制台。 由于某种原因,如果问题的输入有多个单词/字符之间有空格,则在再次请求输入之前,循环将重复每个单词。我卡了一个“咕噜咕噜” 如何防止while循环将字符串视为一系列单词?为什么cin没有和magic

  • 问题内容: 在执行do-while循环时,让JButton重复更新(与计时器一起使用)时遇到了一些麻烦。我正在开发一个简单的游戏,在10 * 10的图块对象网格上玩,该对象对应于具有100个按钮的JButton arrayList。 程序的此部分处理简单的寻路(即,如果我单击角色,然后单击一个空的图块,则角色将在到达目标的途中在每个图块中移动)。每个步骤之间都有一定的延迟,因此用户可以看到角色的进

  • 我在php中工作,现在我正在将时循环应用于我的代码。我正在从数据库中获取数据。现在我必须将该数据应用于页面中的一个Div。 我的问题是"div类="项目活动"在循环中每次活动类都需要。现在我想改变它,就像在第一个循环过程之后,当第二个开始时,我想把那个div改变成这个"div类="项目"。 我对这个循环过程不太熟悉,所以我无法解决这个问题。需要帮助。谢谢

  • 问题内容: 我正在尝试提高SQL编程的效率。我正在尝试运行一个循环,以对仅按数字后缀更改的字段名称重复执行更新命令。 例如,而不是写出来,然后每次更新: 让我知道是否可以澄清。我正在使用SQL Server 2005。 感谢您的指导。 我正在尝试应用Adams的解决方案,并且需要了解以下N’的正确用法: 问题答案: 这实际上将不起作用,因为您不能在列名中加上引号。您实际上要做的是让SQL比较两个始