这是我的问题:我有一个在本地启动模拟服务器的应用程序。此操作的输出被重定向到日志文件,我想在写入时查找此日志文件中的特定模式。
我已经实现了tail -f模拟(我必须在windows上工作),但我不能让两个线程同时正常工作。
以下是一个示例(主要内容):
server.launch();
patternFinder.start();
patternFinder扩展了Thread,这就是它的run方法:
public void run() {
while (true) {
//tail -f implementation
//I'll set a timeout when I can get it
//to work (the pattern is supposed to be found)
}
}
如果我将patternFinder.join()
放在start()
之后,服务器将暂停执行并等待patternFinder返回(但他不会因为日志中没有写入任何内容)。但是子线程需要阻塞主线程,因为我们不希望在找到模式之前执行任何指令(或者已达到超时限制)。
有什么想法吗?
(ps:第一篇文章所以如果我做错了或者你需要更多细节,请不要犹豫告诉我)
答案 0 :(得分:0)
您应该使用事件来协调您的线程。您可以等待主线程中的事件,并在找到事物后在子线程上设置/重置它。
您可以使用Manual或AutoResetEvents。不确定它们在Java中被称为什么,但我相信你可以找到它。
答案 1 :(得分:0)
就这样,这个问题没有得到解答我找到了某种解决办法,但从来没有弄清楚究竟是什么问题。
显然问题是我通过ProcessBuilder启动我的服务器,其命令看起来像java [arguments] [classpath] fileToLaunch
。我尝试了很多东西,但唯一有效的是将命令更改为cmd /C start java [arguments] [classpath] fileToLaunch
,以便在新窗口中启动服务器,然后一切按预期工作。
如果有人能向我解释这个谜,请随时提供一个仍然可以接受的新答案。