3

我在我的程序中实现了一个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(); 

与我的班级 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));
}

我刚刚从答案中挑选出来,但它与我的文件无关。然后我的程序就停止了……</p>

我认为这是因为它找不到 matcher.group(1)。当我删除除第一个以外的所有 sysout 时,我的程序不会停止。

4

1 回答 1

3

您实现 Executor 的方式,tailer 在同一个线程中运行。您可能想要做的是创建一个新线程来执行 MyTailerListener 。尝试例如。

Thread tailerThread=new Thread(tailer);
tailerThread.start();
System.out.println("Stop tailer");
tailerThread.stop();

但是请注意,通常不鼓励使用 Thread.stop(),因为它不允许线程干净地终止。此外,在这个特定的例子中,线程可能在它完成任何工作之前就被终止了。你可能不想要那个。另一个快速的技巧是在停止 tailer 之前等待一秒钟(例如 Thread.sleep(1000);),但是您应该真正定义何时(在何种条件下)应该停止程序并干净地实现它。

于 2015-07-20T15:45:40.270 回答