完全被Java问题难住了
请注意:我不是在“寻找代码”-只是解决这个问题的算法的想法 这是一个家庭作业。我原以为我已经到了本垒打阶段,就要完成比赛了,但最后一部分完全难住了我。我从来没有像这样被困过。它与Java中的线程有关 驱动程序类读取一个文件,第一行表示线程数,第二行是每个线程要读取的文件名的空格分隔列表。每个线程都被编号(0-N),N是文件的总数。每个线程读取指定的文件,并输出到名为t##u out.txt的文件,其中#是线程索引 完成所有这些操作后,驱动程序线程必须: 在所有线程完成执行后,程序Driver.java将打开所有线程 输出文件t#u out.txt,从每个文件中读取一行,然后写入 输出文件out.txt的行 out.txt的示例: MyThread[0]:行[1]:有些东西不喜欢墙,完全被Java问题难住了,java,arrays,algorithm,java.util.scanner,Java,Arrays,Algorithm,Java.util.scanner,请注意:我不是在“寻找代码”-只是解决这个问题的算法的想法 这是一个家庭作业。我原以为我已经到了本垒打阶段,就要完成比赛了,但最后一部分完全难住了我。我从来没有像这样被困过。它与Java中的线程有关 驱动程序类读取一个文件,第一行表示线程数,第二行是每个线程要读取的文件名的空格分隔列表。每个线程都被编号(0-N),N是文件的总数。每个线程读取指定的文件,并输出到名为t##u out.txt的文件,其中#是线程索引 完成所有这些操作后,驱动程序线程必须: 在所有线程完成执行后,程序Driver.j
MyThread[1]:行[1]:世界猪屠夫,
MyThread[2]:行[1]:我想我永远也见不到
MyThread[0]:第[2]行:发送其下方的冻土膨胀,
MyThread[1]:行[2]:工具制造商,小麦堆垛机,
神话阅读[2]:诗句[2]:一首像树一样可爱的诗。
神话阅读[0]:第[3]行:在阳光下洒向上面的巨石,
MyThread[1]:Line[3]:铁路和国家货运处理公司的玩家
神话读物[2]:第[3]行:一棵饥饿的树 我的问题是:我可以设置什么样的循环结构来执行此操作?从t1_out.txt读取一行,写入out.txt,从t2_out.txt读取一行,写入out.txt,从tN_out.txt读取一行,写入out.txt?如何知道一个文件何时到达末尾 想法:
谢谢你的帮助 如果不是所有的文件都已达到EOF,则可以执行一段时间。然后遍历所有文件,对于那些尚未达到EOF的文件,读取下一行并将其写入输出文件。在运行过程中,更新“while”循环的条件变量
这就是你想要做的吗?听起来你可以用a来实现这一点。将每个t#u out.txt的输入添加到
队列
中,然后实现一个循环,从轮询的输入中读取一行并将其写入输出。只要读取行不是EOF,就将输入重新添加到队列
。当队列
为空时,从循环中中断
此外,我还建议为输出使用一个函数,在结尾处使用flush(),这样实际写入只发生一次。以下是要点:
- 创建一个类,该类实现其
方法完成您需要一个线程完成的任务。它可能需要run()
和threadNumber
的字段。run方法应确保关闭()输出文件的输出流filename
- 对于需要创建的每个线程,实例化一个类(为其提供所需的文件名(和其他)数据),并将其传递到。保留对线程对象的引用
- 在所有线程上调用该方法
- 在所有线程上调用该方法(join等待线程完成)
- 执行打开输出文件的最后驱动程序任务
已达到eof的文件将继续读取,但不会返回任何行。您可以选择打印这些内容的空行,也可以跳过这些内容。您知道吗?这与我尝试执行的操作类似,但我的问题是,我将eofReached标志设置为false。如果我将此检查放入一个方法中,并最初将其设置为TRUE,然后循环每个扫描器以查看它是否为.hasNext(),这可能会起作用。我会很快给你更新的。酷,让我知道它是怎么回事。就是这样-这是我的初始标志,我试图从循环中设置。谢谢我已经完成了前4点,我的问题是最后一点。在所有join()方法返回(这是一个阻塞调用)后,所有线程都已完成,输出文件已准备就绪read@Bohemian-我不认为多线程是这里的问题。OP询问的是(同步)任务,即一次读一行每个't#u out.txt'(循环),然后将所有内容写入
out.txt
。感谢您的建议,虽然我可能已经走了这条路线,但现在是凌晨1:17,我很累:)。