我正在编写一个消息队列,但它运行缓慢,方法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);
答案 0 :(得分:1)
你尝试过使用并发吗?它是并发处理的一个问题。假设文件处理是互斥的操作:
您需要以更好的方式设计它以快速运行。单个线程读取和进程文件列表必然运行缓慢。
答案 1 :(得分:0)
您的主要问题可能是用于扫描文件夹的CPU使用情况。
你应该在循环结束时添加Thread.sleep(100);
以给系统一些时间来呼吸。
您希望解决的问题显然是processFile()
方法。您应该按照@Nazgul的评论进行操作,并使用Runnable接口在其自己的类中实现它。
要限制运行的线程数量,请将文件名放在List或Queue中,并在List上实现一个Thread。您可以添加系统可以处理的任意数量的工作线程。队列应该同步,以便您可以安全地同时从多个线程中删除项目。
答案 2 :(得分:0)
你写了一个无限循环,所以你为什么要担心单次迭代需要多长时间?
每次迭代都需要两次读取目录。假设您的processFile
删除了已处理的文件(可能另一个线程或进程添加了一些文件,但删除了没有),则不需要在每次迭代中读取该目录。
阅读一次并处理找到的所有文件。如果没有,则重新读取目录。如果仍然没有,那么你可以终止或睡眠一段时间(或考虑watching目录,但这有点复杂,可能没有必要)。
我强烈建议您在开始使用踏板之前改善循环(然后按建议使用ExecutorService
。)