有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

为了避免XY问题,我将解释上下文: 我正在控制台模式下做一个聊天应用程序。用户可以发送文本或文件。如果用户收到文件,控制台会打印“收到新文件!您想将其保存在哪里?”:

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

我有一个线程listener.java,在那里我可以听到TCP连接,当我收到TCP中的文件时,我想执行一个scanner.nextLine()来询问用户“你想把它保存在哪里?”。 但我不能这样做,因为我的listener.java和我的Main.java相互干扰,两台扫描仪试图同时监听同一个流( System.in )

我尝试了这里指出的解决方案,但它不起作用。 我试图同步扫描仪,但我的线程似乎无法成功锁定扫描仪。 与可重入锁的结果相同

我写了一段代码来让你明白我的意思,这不是我真正的代码,但它重现了我的问题,一个线程与主线程同时执行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.....
    }
}

共 (1) 个答案

  1. # 1 楼答案

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

    接收事件需要适当地同步,理想情况下缓冲到队列中,以便在用户响应之前的事件时可以接收新事件。总而言之,用户交互抽象总是只做一件事——读取用户对下一个事件或下一个命令的响应(如果没有事件)。也就是说,将有一个线程和Scanner专用于读取输入流