2

程序的一般用途

要从命令行读取 bash 模式和指定位置,并在该位置找到与该模式匹配的所有文件,但我必须使程序多线程。

程序的一般结构

  • 解析参数并启动其他类的驱动程序/主类。
  • ProcessDirectories 类,它将从指定根目录中找到的所有目录地址添加到字符串数组中以供以后处理
  • DirectoryData 类,其中包含在上述类中找到的地址
  • ProcessMatches 类,它检查找到的每个目录,并将其中与模式匹配的任何文件添加到字符串数组中,以便稍后打印结果
  • 主/驱动程序再次接管并打印结果:)

问题

即使 ProcessDirectories 类仍在工作,我也需要处理匹配项(为了提高效率,所以我不必在工作前等待列表填充)。为此,我尝试:a) 如果 DirectoryData 为空,则使 ProcessMatches 线程 wait() b) 如果添加了新条目,则使 ProcessDirectories notifyAll()。

问题:)

我看的每个教程都关注生产者和消费者在同一个对象中,或者只处理一个数据结构。当我使用多个数据结构和多个类进行生产和消费时,我该怎么做?

4

2 回答 2

1

怎么样:

class Driver(String args)
{
   ProcessDirectories pd = ...
   BlockingQueue<DirectoryData> dirQueue = new LinkedBlockingQueue<DirectoryData>();
   new Thread(new Runnable(){public void run(){pd.addDirs(dirQueue);}}).start();

   ProcessMatches pm = ...
   BlockingQueue<File> fileQueue = new LinkedBlockingQueue<File>();
   new Thread(new Runnable()
     {
       public void run()
       { 
         for (DirectoryData dir = dirQueue.take(); dir != DIR_POISON; dir = dirQueue.take())
         {
           for (File file : dir.getFiles())
           {
             if (pm.matches(data))
               fileQueue.add(file)
           }
         }
         fileQueue.add(FILE_POISON);
       }
     }).start();

   for (File file = fileQueue.take(); file != FILE_POISON; file = fileQueue.take())
   {
     output(file);
   }
}

当然,这只是一个粗略的想法。 ProcessDirectories.addDirs()只会将DirectoryData对象添加到队列中。在生产中,您需要命名线程。也许使用执行器来提供管理线程。也许使用其他机制来指示处理结束而不是毒消息。此外,您可能希望减少对队列大小的限制。

于 2012-11-19T15:51:47.973 回答
1

拥有一个与两个线程相互通信的数据相关联的数据结构。这可以是具有“从队列中获取数据,如果为空则等待”和“将数据放入队列,如果已满则等待”功能的队列。这些函数应该在内部调用notify并且wait在队列本身上,它们应该同步到该队列。

于 2012-11-19T14:49:56.530 回答