将参数传递给不同类的processbuilder输出流

时间:2014-05-29 05:28:55

标签: java processbuilder

我只是想控制来自不同类

的processbuilder输入流和输出流

是主要的课程

public class Controller
{
    public static void main(String[]args)
    {
        Runner r=new Runner("Test");
        r.activateInput();
        r.setInput("Test");
    }
}

运行流程是其他类

import java.io.*;
public class Runner
{
    boolean activeInput=true;
    boolean active=true;
    String input;
    public Runner(String command)
    {
        try {
         // create a new process
         System.out.println("Creating Process...");

         ProcessBuilder compile = new ProcessBuilder("java","TestOut");
         compile.directory(new File("C:/Users/abhishek221192/Documents/Socket"));
         Process process = compile.start();

         OutputStream stdin = process.getOutputStream ();
         InputStream stderr = process.getErrorStream ();
         InputStream stdout = process.getInputStream ();

         final BufferedReader reader = new BufferedReader (new InputStreamReader(stdout));

         BufferedReader error = new BufferedReader (new InputStreamReader(stderr));
         final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));

         //final Scanner scan=new Scanner(System.in);

           Thread T=new Thread(new Runnable() {

            @Override
            public void run() {
                while(active)
                {
                    if(activeInput)
                    System.out.println(activeInput+"  "+input);
                    String data ="Abhi";
                    data += "\n";
                    try {
                        if(activeInput){
                        writer.write(data);
                        writer.flush();
                        activeInput=false; 
                      }
                        //
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }

            }
        } );
        T.start();
        T.setName("Input");
            Thread T1=new Thread(new Runnable() {

            @Override
            public void run() {
           String line;
         try{
           while ((line = reader.readLine ()) != null) {
                 System.out.println(line);
            }} catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
        }
            } );
        T1.start();
        T1.setName("Output");

         /*   
           String line;
            while ((line = error.readLine ()) != null) {
                 System.out.println(line);
            }
            */
            //stdout.close();

            //error.close();

           //T.stop();
           //stdin.close();
           //System.err.println("stdin closed");
           active=false;
         // close the output stream
         System.out.println("Closing the output stream...");

         //testProcessBuilder();

      } catch (Exception ex) {
         System.out.println("Error"+ex.getMessage());


      }
    }
    public void activateInput()
    {
        this.activeInput=true;
        System.out.println("active"+activeInput);
    }
    public void setInput(String input)
    {
        this.input=input;
    }

}

TestOut代码只包含一个输入语句

TestOut.java

import java.util.*;
public class TestOut
{
   public static void main(String[]args)
   {
      Scanner sc=new Scanner(System.in);
      System.out.println("Output hello TestOut");
      System.out.println("Output1 "+sc.nextLine());
   }
}

我正在考虑此输出

Creating Process...
true  null
Closing the output stream...
activetrue
Output hello TestOut
Output1 Abhi

r.setInput();未设置值

1 个答案:

答案 0 :(得分:0)

我做了一些改变以使其发挥作用。这段代码的主要问题是并发问题,因为两个线程正在处理同一组数据。 {I} Controllerthread T

正在修改activeInput

更改1:

public synchronized void activateInput(boolean activate) {
    this.activeInput = activate;
    System.out.println("active" + activeInput);
}

    if (activeInput) {
        writer.write(data);
        writer.flush();
        activateInput(false);
    }

声明方法activateInput synchronized并使用activateInput = false中的方法调用替换thread T

更改2:

//          active = false;

Runner()方法结束时注释掉了这一行,因为它不必要地停止了编写者Thread。

更改3:

try {
    Thread.sleep(1000);
} catch (InterruptedException e) {
   // TODO Auto-generated catch block
    e.printStackTrace();
    }

在Writer Thread的while循环结束时添加了这个,为作者Thread T提供了一些喘息空间并给它一个读取值的机会。

<强>输出: 这是我得到的输出:

Creating Process...
activetrue
Output hello TestOut
true  Test
activefalse
Output1 Abhi

希望这有帮助。