gpt4 book ai didi

java - 如何在不同线程中处理不同的扫描仪

转载 作者:行者123 更新时间:2023-12-03 13:07:49 24 4
gpt4 key购买 nike

为了避免XY问题,我将解释上下文:
我正在控制台模式下进行聊天应用程序。用户可以发送文本或文件。如果用户收到文件,控制台将打印“收到新文件!要将文件保存在何处?:”。

现在的问题是:
我的while(true)中有一个Main.java循环,我在该循环中询问用户他想做什么,例如“发送”以发送消息,或“ session ”以打印与用户的对话。因此,在此循环中有一个scanner.nextLine()

我有一个listener.java线程,我在其中监听TCP连接,当我收到TCP中的文件时,我想执行一个scanner.nextLine()询问用户“您要将它保存在哪里?”。
但是我不能这样做,因为我的listener.javaMain.java相互干扰,两个扫描程序尝试同时从同一流( System.in )中监听。

我尝试了在此处指示的解决方案Multiple Scanners in Multiple Threads,但是它不起作用。
我试图同步扫描仪,但似乎我的线程无法成功锁定扫描仪。
可重入锁的结果相同...

我写了一段代码来使您理解我的意思,这不是我的实际代码,但是它重现了我的问题,一个与Main同时执行sc.nextLine()的线程。

public static void main(String [] args) throws IOException, InterruptedException {
Scanner sc = new Scanner(System.in);

Thread tt = new Thread(new Runnable() {
@Override
public void run() {

try {
//The thread wait...
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
}

String test= "";
//Here i receive a file so i ask the user where he wants to save it...
synchronized (sc) {
System.out.print("New file received ! where do you want to save it ? ");
test = sc.nextLine();
}
System.out.println("File written : " + test);
}
});
tt.start();

System.out.print("Main blabla ? ");
String bb = "";
while(true) {
synchronized (sc) {
bb = sc.nextLine();

}
System.out.print("blabla : " + bb);
//Do actions.....
}
}

最佳答案

使用多个Scanner从单个流中读取感觉很脆弱。该应用程序将从用户交互功能的封装中受益,因为这种方式可以使流和扫描程序无法被代码库的其他部分直接访问。抽象既应实现命令循环,又应处理从外部传入的事件,例如接收文件。

接收事件需要适本地同步,并且最好将其缓冲到队列中,以便在用户响应先前事件时可以接收新事件。总而言之,用户交互抽象将总是只做一件事-读取用户对下一个事件或下一个命令的响应(如果没有事件)。原来,只有一个线程和Scanner专用于读取输入流。

关于java - 如何在不同线程中处理不同的扫描仪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54159399/

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