在不使用Thread.sleep的情况下为for循环添加延迟 - 没关系,这是一个坏主意

时间:2016-10-10 20:25:52

标签: java split

我有这个代码,它接受String ...

//Takes in string from whatever it is, in this case a JOptionPane
String input = JOptionPane.showInputDialog("Input string");
//if there is a string 
if (!(input == null)) {
    //splits the string into smaller strings of 100 characters for loop that prints the strings  
    int count = input.length() / 100 + 1;
    for (int i = 0; i < count; i++) {
        System.out.println(input.substring(i * 100, (i + 1) * 100 >= input.length() ? input.length() : (i + 1) * 100));
    }
}

..我想在字符串中添加一个延迟,这样它就不会立刻连续打印字符串,而是每秒打印一个字符串而不使用Thread.sleep(1000)

有没有人知道如何做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用ScheduledExecutorService schedule任务来打印具有初始延迟的下一个字符。然后重新安排下一个字符进行打印,直到完成为止。 ScheduledExecutorService在不同的线程上运行,因此如果您想等到打印完所有String,您将不得不使用类似CompletableFuture的东西来指示何时完成所有操作。还要确保打印完成后线程已停止,因此无法无限期运行。

答案 1 :(得分:0)

您正在寻找的内容根本不直观* 没有使用% Get a list of all graphics within the current axes before = findall(gca); % Plot your function fnplt(s); % Figure out all of the graphics that were added to the axes by fnplt added = setdiff(findall(gca), before); % Alter their appearance. set(added, 'Color', [1 0 0]) ,因为这是在代码中添加延迟的最简单方法。

改写它:你想要提出的任何解决方案都避免直接Thread.sleep将涉及将字符串添加到某个缓冲区或等待区域,每秒轮询该缓冲区并将其打印出来字符串,直到缓冲区耗尽。实际上,这是通过工作线程和队列完成的,但如果意图只是打印出字符串,最简单的效果就是使用Thread.sleep

*:我说&#34;直观&#34;因为可能有办法做到这一点,但任何替代解决方法都可能使用Thread.sleep(1000)多个间接层。