ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-08-27 14:51:14  阅读:161  来源: 互联网

标签: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);

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

解决方法:

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

Creates and executes a periodic action
that becomes enabled first after the
given initial delay, and subsequently
with the given delay between the
termination of one execution and the
commencement of the next.

请看一下scheduleAtFixedRate,它具有“运行每一个X millis”的语义,可能更符合您的需求:

Creates and executes a periodic action
that becomes enabled first after the
given initial delay, and subsequently
with the given period; that is
executions will commence after
initialDelay then initialDelay+period,
then initialDelay + 2 * period, and so
on.

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

标签:java,multithreading,scheduled-tasks
来源: https://codeday.me/bug/20190827/1741896.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有