繁体   English   中英

Message Queue性能降低

[英]Message Queue slow performance

我正在编写消息队列,但是它运行缓慢,processFile方法占用太多时间,并且文件长时间卡在队列中。 如何避免。

    System.out.println("Message Reader Started....");
    do 
    {
        String directoryPath = "C:\\Queue";
        int fileCount = new File(directoryPath).list().length;
        if (fileCount < 1) {
            System.out.println("Files Not Present");
        }
        else
        {
            File[] file = new File(directoryPath).listFiles();
            String firstFile = file[0].getAbsolutePath();
            processFile(firstFile);             
        }                       
    } while (true);

您是否尝试过为此使用并发? 这是并发处理的一个合适的问题。 假设文件处理是互斥的操作:

  • 主线程中的do while循环找到要读取的文件
  • 流程文件委托给执行线程进行处理
  • 在处理完(我假设正在读取文件)之后,可以再次并行执行内容的处理。 就像读取前1000行并委托给一个线程进行处理一样。

您需要以更好的方式设计它,以使其快速运行。 单线程读取和处理文件列表势必会运行缓慢。

您的主要问题可能是用于扫描文件夹的CPU使用率。

您应该添加Thread.sleep(100); 在循环结束时给系统一些呼吸的时间。

您要解决的问题显然是processFile()方法。 您应该按照@Nazgul的说明进行操作,并使用Runnable接口在自己的类中实现它。

要限制运行的线程数量,请将文件名放在列表或队列中,并在该列表上实现一个线程。 您可以添加系统可以处理的尽可能多的工作线程。 队列应该同步,以便您可以安全地同时从多个线程中删除项目。

您编写了一个无限循环,那么为什么还要担心一次迭代要花多长时间?

您无需每次重复读取目录两次。 假设您的processFile删除了已处理的文件(并且可能另一个线程或进程添加了一些文件,但未删除任何文件),则您无需在每次迭代中都读取目录。

读取一次并处理找到的所有文件。 如果没有,请重新读取目录。 如果仍然没有,则可以终止或休眠一会儿(或考虑查看目录,但这有点复杂,可能没有必要)。

我强烈建议您在开始踩踏之前改善循环(然后按照建议使用ExecutorService )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM