2012-11-30 59 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"); 
      } 
     } 
    } 
} 
相關問題