【问题标题】:Java's System.out.println(); will it block the program it tty will have latencyJava 的 System.out.println();它会阻塞它tty会有延迟的程序吗
【发布时间】:2017-04-20 13:31:31
【问题描述】:

我将通过非常慢的 ssh 连接运行程序。它会减慢或阻塞

System.out.println();

大量打印。因此,如果它直接在控制台中打印几 GB,但我的连接速度很慢 - 未显示的数据会出现在哪里? tty 内存的大小是多少?如果我将失去连接一段时间 - 它还会运行吗?

【问题讨论】:

  • 这个问题太宽泛了,你能不能详细说明一下,比如给出例子或者解释一下数据类型以及你将要做什么?
  • 数据类型? PrintStream 只打印字符串?这个问题不是关于 java 的,而是关于 TTY 和控制台的。

标签: java linux console tty


【解决方案1】:

没有。 PrintWriter 不等待确认完成。

【讨论】:

    【解决方案2】:

    它会阻塞它tty会有延迟的程序

    Java 的控制台输出是blocking,因此您的代码可能会阻塞,尤其是当您写入大量数据时。

    tty 内存大小是多少?

    我很确定这取决于你的内核,这个old thread 表明它在某个时候是 4096 字节:

    我查看了内核代码 (linux\drivers\char\serial.c),其中有一个名为 SERIAL_XMIT_SIZE 的#define。起初我想也许我可以改变它,但似乎传输缓冲区实际上被固定为一个内存页面(4k)。

     

    如果我将失去连接一段时间 - 它还会运行吗?

    是的,如果没有人连接到tty,那么它会运行得更快,因为它可以丢弃数据。

    也是模拟您的用例的小型测试应用程序。

    Echo.java

    import java.io.IOException;
    
    public class Echo {
        public static void main(String[] args) throws InterruptedException, IOException {
            final byte[] data = new byte[Test.BODY_LENGTH + Test.END_MARKER.length];
            int index = 0;
            outer: while (true) {
                data[index++] = (byte) System.in.read();
                final int dataOffset = index - Test.END_MARKER.length;
                if (dataOffset < 0) {
                    continue;
                }
                for (int i = 0; i < Test.END_MARKER.length; i++) {
                    if (data[dataOffset + i] != Test.END_MARKER[i]) {
                        continue outer;
                    }
                }
                System.out.print(new String(data, 0, index));
                return;
            }
        }
    }
    

    Test.java

    import java.io.File;
    import java.io.IOException;
    import java.util.concurrent.ThreadLocalRandom;
    import java.util.concurrent.TimeUnit;
    
    public class Test {
    
        public static final byte[] END_MARKER = "$TERMINATE$".getBytes();
        public static final int BODY_LENGTH = 1024768;
    
        public static void main(String[] args) throws IOException, InterruptedException {
            StringBuilder data = new StringBuilder();
            for (int i = 0; i < BODY_LENGTH; i++) {
                data.append((char) ('a' + ThreadLocalRandom.current().nextInt(('z' - 'a' + 1))));
            }
            final Process process = new ProcessBuilder("java", Test.class.getPackage().getName() + ".Echo")
                    .directory(new File("out/production/week 3")) // Change to your output directory
                    .start();
            process.getOutputStream().write(data.toString().getBytes());
            process.getOutputStream().write(END_MARKER);
            process.getOutputStream().flush();
            System.out.println("Written!");
            final boolean exitedAfterWroteData = process.waitFor(5, TimeUnit.SECONDS);
            System.out.println(exitedAfterWroteData ? "Complete" : "Running"); // Will print running after 5 seconds
            int read = 0;
            while (process.getInputStream().read() > -1) {
                read++;
            }
            if (read != data.toString().getBytes().length + END_MARKER.length) {
                throw new IllegalStateException("Expected echo to print exactly " + BODY_LENGTH + END_MARKER.length + " symbols!");
            }
            final boolean exitedAfterWeReadData = process.waitFor(50, TimeUnit.MILLISECONDS);
            System.out.println(exitedAfterWeReadData ? "Complete" : "Running"); // Will print complete after a few milliseconds
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多