gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:29:58 25 4
gpt4 key购买 nike

程序的一般用途

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

程序的一般结构

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

问题

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

问题 :)

我看的每个教程都集中在同一对象中的生产者和消费者,或者只处理一个数据结构。当我使用不止一种数据结构和不止一种类来进行生产和消费时,我该如何做到这一点?

最佳答案

怎么样:

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 对象添加到队列中。在生产中,您需要为线程命名。也许使用执行程序来提供管理线程。也许使用一些其他机制来指示处理结束而不是毒消息。此外,您可能希望减少队列大小的限制。

关于java - 如何在 Java 中的不同对象之间等待和通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13456151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com