0

I will run the program over very slow ssh connection. Will it slow down or block the

System.out.println();

on big loads of printing. So if it prints few gigabytes right into console, but my connection is slow - where undiplayed data will appear? what is the size of tty memory? If I will lose connection for a while - will it run still?

UPvoter
  • 45
  • 7
  • this question is too broad can you specify more like giving examples or explain about data type and what you will exactly try to do ? – Gürtuğ Güngör Apr 20 '17 at 13:35
  • data type? PrintStream only prints String? this question is not about java, but more about TTY and console. – UPvoter Apr 20 '17 at 13:45

2 Answers2

1

No. PrintWriter does not wait for confirmation of completion.

ControlAltDel
  • 33,923
  • 10
  • 53
  • 80
0

Will it block the program it tty will have latency

Java's console output is blocking, so potentially your code may block, especially when you writing a lot of data.

what is the size of tty memory?

I am pretty sure that it depends on your kernel, this old thread suggests that it was 4096 bytes at some moment:

I've looked in the kernel code (linux\drivers\char\serial.c) and there is a #define called SERIAL_XMIT_SIZE. At first I thought maybe I could change that but it seems that the transmit buffer is actually fixed to be a memory page (4k).

 

If I will lose connection for a while - will it run still?

Yes, and if there is no one connected to the tty, then it will run much faster, as it will be able to discard the data.

Also small test application that simulates your use-case.

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
    }
}
Community
  • 1
  • 1
user3707125
  • 3,394
  • 14
  • 23