使用Java runtime class
  传入相应的command, 然后执行并把输入显示出来
  然后发现这样做行不通, 因为没法执行下面的code
  查了相关资料才知道这个叫线程阻塞
  于是乎只能找到一种非线程阻塞的方法
  这个时候找到一个commons-exec的project能给解决问题
  根据官方文档,如果使用非阻塞执行,可以这样做:
  首先创建一个非阻塞的handler DefaultExecuteResultHandler,这个是专门用来处理非阻塞
  在创建一个watchdog用来监控输出,设置timeout时间60s
  创建一个执行器设置退出代码为1,代表执行成功
  注意,这里必须设置一个waitfor time,如果没有设置会报错
resultHandler.waitFor(5000);
publicstaticStringAPPIUMSERVERSTART="C:\ProgramFiles(x86)\Appium\node_modules\.bin\appium.cmd";
publicstaticvoidstartServer()throwsIOException,InterruptedException
{
startServer("4723");
//RuntimeExecappiumObj=newRuntimeExec();
//appiumObj.excuteCMD(APPIUMSERVERSTART);
DefaultExecuteResultHandlerresultHandler=newDefaultExecuteResultHandler();
CommandLinecommandLine=CommandLine.parse(APPIUMSERVERSTART);
ExecuteWatchdogdog=newExecuteWatchdog(60*1000);
Executorexecutor=newDefaultExecutor();
executor.setExitValue(1);
executor.setWatchdog(dog);
executor.execute(commandLine,resultHandler);
resultHandler.waitFor(5000);
System.out.println("Appiumserverstart");
}
  以上code实现的是使用默认的port启动Appium server ,如果遇到Appium端口被占用,启动失败怎么办?
  我的策略是先杀掉所以占用这个端口的进程:
  可以尝试使用command line
cmd /c echo off & FOR /F "usebackq tokens=5" %a in (`netstat -nao ^| findstr /R /C:"4723"`) do (FOR /F "usebackq" %b in (`TASKLIST /FI "PID eq %a" ^| findstr /I node.exe`) do taskkill /F /PID %a)
/**
* @author Young
* @param appiumServicePort
* @throws ExecuteException
* @throws IOException
*/
public static void stopAppiumServer(String appiumServicePort) throws ExecuteException, IOException
{
ExectorUtils.runWithWatchDog("cmd /c echo off & FOR /F "usebackq tokens=5" %a in"
+ " (`netstat -nao ^| findstr /R /C:"" + appiumServicePort + ""`) do (FOR /F "usebackq" %b in"
+ " (`TASKLIST /FI "PID eq %a" ^| findstr /I node.exe`) do taskkill /F /PID %a)");
}
  这样可以在每个test case启动相应的Appium server并且给出指定的参数。