在Java中,如何在不同的对象之间等待和通知?

在Java中,如何在不同的对象之间等待和通知?,java,multithreading,concurrency,wait,notify,Java,Multithreading,Concurrency,Wait,Notify,计划的一般用途 从命令行读取bash模式和指定的位置,并在该位置找到与该模式匹配的所有文件,但我必须使程序成为多线程的 课程的总体结构 驱动程序/主类,解析参数并启动其他类 ProcessDirectories类,它将从指定根目录找到的所有目录地址添加到字符串数组中,以供以后处理 DirectoryData类,它保存在上述类中找到的地址 ProcessMatches类,该类检查找到的每个目录,并将其中与模式匹配的任何文件添加到字符串数组中,以便稍后打印结果 主/驱动程序再次接管并打印结果:)

计划的一般用途

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

课程的总体结构

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

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

问题:)


我看的每一篇教程都关注生产者和消费者在同一个对象中,或者只处理一个数据结构。当我使用多个数据结构和多个类来生产和消费数据时,我如何做到这一点?

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

类似于:

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);
   }
}
类驱动程序(字符串参数)
{
ProcessDirectory pd=。。。
BlockingQueue dirQueue=新建LinkedBlockingQueue();
新线程(new Runnable(){public void run(){pd.addDirs(dirQueue);}}}).start();
ProcessMatches pm=。。。
BlockingQueue fileQueue=新建LinkedBlockingQueue();
新线程(newrunnable())
{
公开募捐
{ 
for(DirectoryData dir=dirQueue.take();dir!=dir\u;dir=dirQueue.take())
{
对于(文件:dir.getFiles())
{
如果(pm.匹配(数据))
添加(文件)
}
}
fileQueue.add(FILE\u POISON);
}
}).start();
对于(File=fileQueue.take();File!=File\u POISON;File=fileQueue.take())
{
输出(文件);
}
}

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

是否需要出于特定原因(如分配)使用
wait()
/
notify()
?比起使用低级并发原语,有更好(更简单!)的方法来解决您的问题。我并没有粘贴您的代码,但我采纳了很多想法,我让它工作起来了!:D谢谢:)