如何通过键盘输入停止执行while循环?

时间:2017-02-03 12:21:11

标签: java multithreading while-loop

我有几个主题。每个线程都有一个while(true)循环,我在其中添加逐周期文本。我没有找到一个很好的方法来改变带有标志的while(true)循环,这样我可以在循环时关闭文件。我想在输入内容时或者按下Eclipse红色按钮时这样做。

这是构造函数(节点是一个线程)

public Node(Channel c, int address) {
    my_address=address;
    try {
        writer = new CSVWriter(new FileWriter(my_address + "_id.csv"), ',', ' ' , ' ' ,"\n");
        writer2 = new CSVWriter(new FileWriter(my_address + "_label.csv"), ',', ' ' , ' ' ,"\n");
        String[] entries = "num#state#duration#event#condition#condition result#action1#action2#backoff value".split("#");
        writer.writeNext(entries);
        writer2.writeNext(entries);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是我修改文件的循环:

while (true) {
        //write id value
        String id_to_split = num+"#"+fsm.current_state.nome+"#"+tempo_minore+"#"+
                fsm.current_transition.e.getId()+"#"+ fsm.current_transition.c.getId()+"#"+
                fsm.current_transition.c.getFlag()+"#"+fsm.current_transition.a.getId()+"#"+
                fsm.current_transition.a2.getId()+"#"+backoff;

        String[] id_entries = id_to_split.split("#");
        writer.writeNext(id_entries);

        //write name
        String label_to_split = num+"#"+fsm.current_state.nome+"#"+tempo_minore+"#"+
                fsm.current_transition.e.getLabel()+"#"+fsm.current_transition.c.getLabel()+"#"+
                fsm.current_transition.c.getFlag()+"#"+fsm.current_transition.a.getLabel()+"#"+
                fsm.current_transition.a2.getLabel()+"#"+backoff;

        String[] label_entries = label_to_split.split("#");

        writer2.writeNext(label_entries);

        num++;
}
    closeCSVs();
}

方法 closeCSVs():

    public void closeCSVs() {
    try {
        writer.close();
        writer2.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

2 个答案:

答案 0 :(得分:2)

如果我正确地理解了您的问题,那么您正在寻找的是资源尝试块,其效果如下:

try(FileReader reader = new FileReader("path")) {
    while(true) {
        //use resources
    }
}

您可以将它与任何实现AutoClosable-Interface的类(基本上每个提供.close()方法的类)一起使用。 在转义try-block后,资源将自动关闭。

相同的解决方案不同的代码将用经典的try包装并向其添加finally块。

try {
    FileReader reader = new FileReader("path");
    while(true) {
        //use resources
    }
} finally {
    reader.close();
}

答案 1 :(得分:0)

您可能需要在关闭挂钩Runtime.addShutdownHook

中实现关闭文件