[英]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);
您是否尝试过为此使用并发? 这是并发处理的一个合适的问题。 假设文件处理是互斥的操作:
您需要以更好的方式设计它,以使其快速运行。 单线程读取和处理文件列表势必会运行缓慢。
您的主要问题可能是用于扫描文件夹的CPU使用率。
您应该添加Thread.sleep(100);
在循环结束时给系统一些呼吸的时间。
您要解决的问题显然是processFile()
方法。 您应该按照@Nazgul的说明进行操作,并使用Runnable接口在自己的类中实现它。
要限制运行的线程数量,请将文件名放在列表或队列中,并在该列表上实现一个线程。 您可以添加系统可以处理的尽可能多的工作线程。 队列应该同步,以便您可以安全地同时从多个线程中删除项目。
您编写了一个无限循环,那么为什么还要担心一次迭代要花多长时间?
您无需每次重复读取目录两次。 假设您的processFile
删除了已处理的文件(并且可能另一个线程或进程添加了一些文件,但未删除任何文件),则您无需在每次迭代中都读取目录。
读取一次并处理找到的所有文件。 如果没有,请重新读取目录。 如果仍然没有,则可以终止或休眠一会儿(或考虑查看目录,但这有点复杂,可能没有必要)。
我强烈建议您在开始踩踏之前改善循环(然后按照建议使用ExecutorService
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.