【问题标题】:how to add another console to interact with multi-threaded program如何添加另一个控制台以与多线程程序进行交互
【发布时间】:2012-11-30 21:52:41
【问题描述】:

我有一个单线程程序做一些长时间运行的计算工作。主线程正在使用控制台进行一些输出。我正在考虑添加另一个线程来与用户交互以查询诸如作业进度或进程内部状态之类的内容。

假设同步处理得当,并且用户通过命令行控制台之类的东西与第二个线程进行交互(不需要 GUI)。实现此功能的好方法是什么?我想我可以让第二个线程等待某个命名管道上的命令,并让用户使用 GNU 屏幕之类的东西连接到这个管道(我不确定它是否会工作)。

是否有任何库(Java 或非 Java)或工具来实现这一点?我的程序在 Linux 上运行。

【问题讨论】:

  • "我的程序在 Linus 上运行。" - 虽然我知道 Java 还没有完全达到最初的目标,但这不重要。您实际需要的所有库都应该是标准集的一部分,尤其是对于命令行交互之类的东西(尽管一些第 3 方的东西可能会让它更容易接受)。否则....这个问题可能有点太宽泛了,但是这种事情经常试图将长期运行的工作分成几部分,这样它就可以检查命令并更新状态。此外,我们建议您接受您之前问题的一些答案。

标签: java multithreading console pipe gnu-screen


【解决方案1】:

做你想做的实际上需要两个命名管道:一个用于每个方向。在这方面,使用套接字可能是更好的选择(尽管在服务器端处理可能有点困难)。

至于客户端,我不认为 GNU/Screen 可以用来做这件事。如果您使用命名管道,客户端应该简单地使用cat(实际上是两个cat 进程:一个写入服务器,一个读取答案)。如果你实现基于套接字的通信,你可以为客户端使用netcat (nc)。

【讨论】:

    【解决方案2】:

    您需要另一个线程来读取用户的输入。这就是我的做法......

    package com.mycompany.readthread;
    
    import java.io.*;
    
    public class Launcher {
        public static void main(String[] args) {
            new Launcher().run();
        }
    
        public void run() {
            LongRunningJob job = new LongRunningJob();
            ReadInputLoop readInputLoop = new ReadInputLoop(job);
            Thread readInputLoopThread = new Thread(readInputLoop);
            readInputLoopThread.start();  // run read input loop in another thread
            job.run();  // run long running job in this thread
        }
    
        class LongRunningJob implements Runnable {
            private double percentageComplete;
    
            @Override
            public void run() {
                // long running job
                // update percentageComplete in a synchronized block
            }
    
            public synchronized double getPercentageComplete() {
                return percentageComplete;
            }
        }
    
        class ReadInputLoop implements Runnable {
            private LongRunningJob job;               
    
            public ReadInputLoop(LongRunningJob job) {
                this.job = job;            
            }
    
            @Override
            public void run() {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                try {
                    while (true) {
                        String line = br.readLine();
                        if ("exit".equalsIgnoreCase(line)) {
                            break;
                        }
                        if ("progress".equals(line)) {
                            double percentageComplete = job.getPercentageComplete();
                            System.out.println(String.format("%.3g", percentageComplete)+ "%");
                        }
                    }                
                }
                catch (IOException ex) {
                    System.err.println("Unexpected exception");
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多