【问题标题】:how can I stop the execution of the while loop with a keyboard input?如何使用键盘输入停止执行 while 循环?
【发布时间】:2017-06-20 19:44:08
【问题描述】:

我有几个线程。每个线程内部都有一个 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();
    }
}

【问题讨论】:

  • 请贴一些代码示例。
  • 如何在循环后关闭文件并在满足特定条件时中断循环?要检查什么条件以及如何检查取决于您。如果可能的话,我也不会在构造函数(线程的?)中打开文件流,而是在进入循环之前打开文件流。
  • 要修复代码以执行您想要的操作,您很可能需要进行更改。
  • 或者当我按下 Eclipse 红色按钮时 这只是简单地终止了进程,因此没有明确的解决方案。

标签: java multithreading while-loop


【解决方案1】:

如果我正确理解了您的问题,那么您正在寻找的是一个 try-with-resources 块,其工作原理如下:

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

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

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

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

【讨论】:

  • 最好在第一段代码中添加 finally 并在此处关闭 FileReader。
  • @TotumusMaximus,因为它是AutoClosable
  • 你是对的。无论如何,我更喜欢经典的 try-catch-finally,而不是 try with resources,因为我认为它更具可读性,而且我发现它在 I/O 上的表现要好得多。但不确定这是否普遍正确。
  • 我必须在文件上写行,在 while 循环内,我寻找一种停止 while 循环的好方法,例如当我按下一个键时。
  • 好的,所以我认为您的解决方案最简单的方法是 while(flag) 循环,布尔标志最初为 true,并通过控制台输入设置为 false(使用带有 system.in 的扫描仪)并在while循环中简单地检查scanner.hasNext()。
【解决方案2】:

您可能需要在关闭钩子Runtime.addShutdownHook中实现关闭文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    相关资源
    最近更新 更多