Java的System.out.println();会不会阻塞程序,它的tty会有延迟的。

0 人关注

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

System.out.println();

在大负荷的打印中。那么,如果它把几千兆字节的数据直接打印到控制台,但我的连接速度很慢--未显示的数据会出现在哪里? TTY内存的大小是多少?如果我有一段时间失去连接,它还能运行吗?

2 个评论
这个问题太宽泛了,你能不能具体说明一下,比如举个例子或者解释一下数据类型,以及你到底要做什么?
数据类型?PrintStream只打印字符串?这个问题不是关于java的,而是关于TTY和控制台的。
java
linux
console
tty
UPvoter
UPvoter
发布于 2017-04-20
2 个回答
ControlAltDel
ControlAltDel
发布于 2017-04-20
已采纳
0 人赞同

不,PrintWriter不等待确认完成。

user3707125
user3707125
发布于 2017-04-20
0 人赞同

它是否会阻止程序,它的tty会有延迟。

Java的控制台输出是 blocking 因此,你的代码有可能会堵塞,特别是当你写了很多数据的时候。

tty内存的大小是多少?

我非常确定,这取决于你的内核,这个 老话题 表明它在某个时刻是4096字节。

我看了一下内核代码(linux\drivers\char\serial.c),有一个#define叫做SERIAL_XMIT_SIZE。起初我想也许我可以改变它,但似乎发送缓冲区实际上被固定为一个内存页(4k)。

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!");