我已经在程序中实现了tailerListener,但是当我启动它时,它永远不会停止。
这是我的程序:
public class PostClient{
private static File file = new File("../file.txt");
public static void main(String [] args){
// TAILER LISTENER
TailerListenerAdapter listener = new MyTailerListener();
Tailer tailer = new Tailer(file, listener, 500);
Executor executor = new Executor() {
public void execute(Runnable command) {
command.run();
}
};
System.out.println("Execution of the tailer");
executor.execute(tailer);
System.out.println("Stop tailer");
tailer.stop();
与我的 class MyTailerListener
import org.apache.commons.io.input.TailerListenerAdapter;
public class MyTailerListener extends TailerListenerAdapter {
public void handle(String line) {
System.out.println(line);
}
}
一开始,我设法转到了tailer.stop(所以程序停止了,很好),但是在写了几行并触摸了几行之后,它不再起作用了。
奇怪的是,当我将我的类MyTailerListener替换为:
public void handle(String line) {
final String logEntryPattern = "(\\w+\\s+\\d+\\s+\\d{2}:\\d{2}:\\d{2})\\s+(\\S+)\\s+(\\S+):\\s+(.+)";
final Pattern p = Pattern.compile(logEntryPattern);
final Matcher matcher = p.matcher(line);
System.out.println("Total groups: " + matcher.groupCount());
System.out.println("Date&Time: " + matcher.group(1));
System.out.println("Hostname: " + matcher.group(2));
System.out.println("Program Name: " + matcher.group(3));
System.out.println("Log: " + matcher.group(4));
}
我只是从答案中挑选出来的,但与我的档案无关。然后我的程序停止了……
我认为是因为找不到matcher.group(1)。当我删除所有sysout而不是第一个时,我的程序不会停止。
最佳答案
实现Executor的方式中,tailer在同一线程中运行。您可能想要做的是创建一个新线程来执行MyTailerListener。
Thread tailerThread=new Thread(tailer);
tailerThread.start();
System.out.println("Stop tailer");
tailerThread.stop();
但是请注意,通常不建议使用Thread.stop(),因为它不允许线程干净终止。同样,在此特定示例中,线程可能在完成任何工作之前就被终止了。您可能不想要那样。另一个快速的技巧是在停止拖尾之前要等待一秒钟(例如Thread.sleep(1000);),但是您应该真正定义何时(在何种条件下)停止程序并完全实现该程序。