gpt4 book ai didi

java - Java中从控制台获取输入: Is it blocking or non-blocking?

转载 作者:行者123 更新时间:2023-11-30 05:47:30 24 4
gpt4 key购买 nike

我正在编写一个Java程序,其中我从控制台读取一行,并围绕它进行一些处理。处理可能需要 1-2 秒(即花费的时间比输入速率长),而我可能会继续每秒接收 50 行。

虽然也有一些类似的问题,但他们讨论的是 C/C++ 而不是 Java。所以我的基本问题如下:

仍在处理输入/行时,我是否无法接收新输入?或者以某种方式它们在系统/JVM 中排队?或者更好地这样问:处理需要时间时我是否会错过任何行?我无论如何都不想错过任何行。

这是我的代码片段:

Scanner sc = new Scanner(System.in);

while(sc.hasNext()){
//process line. Can take 1-2 seconds.
processInput(sc.nextLine());
}
sc.close();

更新:

根据建议,我想出了使用 Executors 让我的代码更加线程友好:

ExecutorService executorService = Executors.newFixedThreadPool(10);
while (sc.hasNext()) {
executorService.submit(new Runnable() {
public void run() {
processInput(sc.nextLine());
}
});
}

最佳答案

只需比较这两个示例:

首先,没有多线程的线性:

public class SampleClass {

public static void main(String[] args) {
SampleClass instance = new SampleClass();
instance.start();
}

private void start() {
Scanner sc = new Scanner(System.in);
String input;

while (!(input = sc.nextLine()).equals("exit")) {
processInput(input);
}

sc.close();
}

private void processInput(String input) {
try {
Thread.sleep(2000);
System.out.println("input: " + input);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

然后,为每个输入处理使用一个新线程:

public class SampleClass {

public static void main(String[] args) {
SampleClass instance = new SampleClass();
instance.start();
}

private void start() {
Scanner sc = new Scanner(System.in);
String input;

while (!(input = sc.nextLine()).equals("exit")) {
processInput(input);
}

sc.close();
}

private void processInput(String input) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
System.out.println("input: " + input);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
}

}

试试吧。在这两种情况下,您都不会错过输入,但区别在于,如果没有新线程,处理时间就会增加(当然) - 它不会并行运行。

关于java - Java中从控制台获取输入: Is it blocking or non-blocking?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54595775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com