Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java工作线程中的无限循环无法通过ScheduledExecutorService暂停_Java_Multithreading - Fatal编程技术网

java工作线程中的无限循环无法通过ScheduledExecutorService暂停

java工作线程中的无限循环无法通过ScheduledExecutorService暂停,java,multithreading,Java,Multithreading,大家好,我有一个问题,关于一连串的神灯问题。该程序将显示一串精灵灯光,并无限地浏览灯光对象集合,打开和关闭它们 我已经实现了在ScheduledExecutorService中执行,并将执行器的初始延迟设置为零,进一步延迟30秒 ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); `ScheduledFuture sequenceFutre = executor.scheduleWithFixedDel

大家好,我有一个问题,关于一连串的神灯问题。该程序将显示一串精灵灯光,并无限地浏览灯光对象集合,打开和关闭它们

我已经实现了在ScheduledExecutorService中执行,并将执行器的初始延迟设置为零,进一步延迟30秒

ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
`ScheduledFuture sequenceFutre = executor.scheduleWithFixedDelay(sequenceRunnable, 0, 30, TimeUnit.SECONDS);`
我有这样的灯光数组列表循环

        try {
        while (!pause) {
            for (int i = 0; i < theLights.size(); i++) {
                Light light = theLights.get(i);
                System.out.println(String.format(outputstr, (i + 1), light.turnOn()));
                Thread.sleep(HALF_SECOND_INTERVAL);
                System.out.println(String.format(outputstr, (i + 1), light.turnOff()));
            }
        }
    } catch (InterruptedException ie) {
        ie.printStackTrace();
    } catch(Error err) {
        err.printStackTrace();
    }
试试看{
当(!暂停){
对于(int i=0;i
我在这里缺少的部分是,包装在其中的runnable似乎不会在30秒时停止,并在恢复之前等待30秒,这是必需的

有人能帮忙吗?我缺少什么?

每次执行都会调用runnable
run()
方法。您不应该在代码中使用while循环,应该在每个序列完成后从run方法返回

更新:

正如OP所指出的,一次“运行”应该基于时间长度,因此您的运行方法应该跟踪它已经运行了多长时间。i、 e.在run方法开始时记录当前时间,然后保持循环直到30秒过去,然后从run方法返回。

每次执行都会调用runnable
run()
方法。您不应该在代码中使用while循环,应该在每个序列完成后从run方法返回

更新:


正如OP所指出的,一次“运行”应该基于时间长度,因此您的运行方法应该跟踪它已经运行了多长时间。i、 e.在运行方法开始时记录当前时间,然后继续循环,直到30秒结束,然后从运行方法返回。

能否提供有关暂停变量的其他上下文?它到底是如何设置的?@Lefty,它本身不是设置的,它的初始值为false,并以这种方式保留。(没有双关语)您能提供一些关于pause变量的附加上下文吗?它到底是如何设置的?@Lefty,它本身不是设置的,它的初始值为false,并以这种方式保留。(没有双关语)事实上,如果它永远不会返回,它只会被调用一次。@jtahlborn这是一个直接的runnable,run是无效的,因此没有返回。。。。或者我应该将该部分升级为可调用且公正的“return;”@JBNizet,这是我发现自己陷入的陷阱-你会猜到我对并发编程相当陌生-它需要不确定地运行,还是你建议我以后继续调用get?要求它连续运行30秒,然后等待30秒,应用了建议,感谢大家,它对列表进行了一次迭代,然后停止并等待,直到再次调用时,它才再次运行列表…@Beer0-我已经更新了我的答案。希望您现在已经意识到,您可以从一个void方法返回(或者只是让控制转到方法的末尾)。而且,事实上,如果它从未返回,则只调用一次。@jtahlborn这是一个直接可运行的方法,run是void,因此没有返回。。。。或者我应该将该部分升级为可调用且公正的“return;”@JBNizet,这是我发现自己陷入的陷阱-你会猜到我对并发编程相当陌生-它需要不确定地运行,还是你建议我以后继续调用get?要求它连续运行30秒,然后等待30秒,应用了建议,感谢大家,它对列表进行了一次迭代,然后停止并等待,直到再次调用时,它才再次运行列表…@Beer0-我已经更新了我的答案。希望此时您已经意识到,您可以从void方法返回(或者让控制权转到方法的末尾)。