是什么导致计划的线程不能在Java中运行?

Kam*_*eld 3 java multithreading scheduled-tasks

我开发了一个小型Java应用程序,它通过计划的执行程序服务运行两个计划的线程.在大多数计算机上,我的应用运行得很好 然而,在测试中,我遇到了一台计算机,我的线程没有按照它们应该或根本不运行的频率运行.我有一个线程计划以250毫秒的间隔运行.它只是检查std中是否有任何要读取的内容,如果它有读取并执行命令.这个线程偶尔运行,但从来没有像它应该的那样经常运行.我的另一个线程每5秒运行一次,只需在屏幕上打印一些东西.它运行一次然后再也不会运行.这是我正在使用的代码:

    scheduledThreadManager.scheduleWithFixedDelay(new Runnable()
    {
        @Override
        public void run()
        {
            try
            {
                if(inputReader.ready())
                {
                    String command = inputReader.readLine();
                    executeCommand(command);
                }
            }
            catch(IOException e)
            {
                System.out.println(e.toString());
                e.printStackTrace();
            }
        }
    }, 250, 250, TimeUnit.MILLISECONDS);

    scheduledThreadManager.scheduleWithFixedDelay(new Runnable()
    {
        @Override
        public void run()
        {
            System.out.println(idleString);
        }
    }, 0, 5000, TimeUnit.MILLISECONDS);
Run Code Online (Sandbox Code Playgroud)

我已确保在执行计划的线程期间我的应用程序没有挂起.计算机里面有一个Core2Duo处理器,所以我看不出硬件是如何无法满足我的需求的,但也许并非如此.另一件有趣的事情是,除了这些之外我运行的是一个主应用程序线程,它运行正常.任何对这个问题的原因的输入都将非常感激.

ska*_*man 5

你说"我有一个线程计划以250毫秒的间隔运行",但这不是你编程它要做的.你使用过scheduleWithFixedDelay,这意味着"在一次执行结束和下一次执行结束之间留出250ms".因此,如果您的任务需要100毫秒才能执行,那么执行之间的距离将达到350毫秒,如果您的任务的执行时间变化很大,那么它的执行时间也会有所不同.

创建并执行一个周期性动作,该动作在给定的初始延迟之后首先被启用,并且随后在一次执行的终止和下一次执行的开始之间给定延迟.

scheduleAtFixedRate相反,看看它有"运行每X毫米"的语义,可能更符合您的需求:

创建并执行一个周期性操作,该操作在给定的初始延迟后首先启用,然后在给定的时间段内启用; 即执行将在initialDelay之后开始,然后是initialDelay + period,然后是initialDelay + 2*period,依此类推.

最大的危险scheduleAtFixedRate在于,如果配置错误,您的任务可能会重叠,或者您的任务执行时间过长.