2012-11-30 40 views
1

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

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

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

+0

“我的程序在Linus上运行。” - 虽然我知道Java并没有完全达到最初的目标,但这并不重要。你实际需要的所有库都应该是标准集的一部分,尤其是对于命令行交互(尽管一些第三方的东西可能使它更容易)。否则......这个问题可能有点过于宽泛,但这类事情往往会试图将长时间运行的工作分解成小块,因此它可以检查命令并更新状态。另外,我们建议您接受以前问题的一些答案。 –

回答

1

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

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

1

您需要另一个线程来读取用户的输入。以下是我该怎么做...

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"); 
      } 
     } 
    } 
} 
相关问题