Java多线程:如何启动正在执行线程的外部Java程序?

时间:2014-12-03 18:49:02

标签: java multithreading processbuilder

目前,我正在尝试编写一个程序,它应该多次执行单独的Java程序,但具有不同的参数。这个执行的Java程序调用一个Thread-Class。在此类中,建立与(游戏)服务器的连接。连接后,线程会发送一个命令,每10毫秒转动一次连接的播放器。我有2"解决方案"为此:

简单(有效)的一个:

public class GeneralAgentTest {

public static void main(String [] args){

    Thread thread = new Thread(new HexagonRunner("127.0.0.1",6000,"UnitedTestors",-30,-15));
    thread.start();
}
}

这是正常的,但实际上并不是我的目标。我需要启动几个Threads(新线程(新的HexagonRunner(" 127.0.0.1",6000," UnitedTestors", - 30,-15));)和每个这个线程必须由一个单独的进程处理。

为此,我用ProcessBuilder编写了一些代码。这是一个班级。

第二个没有正确地工作一个:

public void execute(Class class1, int a, String str, String team, String x,
        String y) {

    ProcessBuilder builder;
    String javaHome = System.getProperty("java.home");
    String javaBin = javaHome + File.separator + "bin" + File.separator
            + "java";
    String classpath = System.getProperty("java.class.path");
    String className = class1.getCanonicalName();

    builder = new ProcessBuilder(javaBin, "-cp", classpath,
            className, ip, port, team, str, x, y);

    try {
        process[a] = builder.start();
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("failed");
    }

public void loadPlayers() {
    process = new Process[4];
    for (int i = 0; i < 4; i++) {
        try {
            execute(processes.StartProcesses.class, i,
                    playerCombo[i].getSelectedItem().toString(),
                    playerTeam[i].getText(), playerStartX[i].getText(),
                    playerStartY[i].getText());

        } catch (Exception e) {
            System.out.println("Failed to create processes for players");
            e.printStackTrace();
        }
    }
}

这些是我编写的函数,用于执行正在/正在启动线程的类。 下面的课程被执行:

public class StartProcesses{

public static void main(String[] args) {

        Thread t = null;
        t = new Thread(new HexagonRunner("127.0.0.1",6000,"UnitedTestors",-30,-15));
        t.start();
            JOptionPane.showMessageDialog(null, "should've started");
}
}

在我的第二次尝试中,给予StartProcesses类的参数包含一些信息,如IP-Adresses,Portnumbers,Playerpositons和类似的东西。无论如何,我试图用&#34; hard&#34;来执行课程。信息,只是为了确保它在我的第一个代码部分中起作用。

在两次尝试中都正确建立了与服务器的连接,但在第一次尝试中,线程一直在工作。在我的第二次尝试中,似乎连接建立后线程已经死了。该进程仍然存在,因为与服务器的连接仍然存在。

这是一些代码,但我想说的是,Thread在手动执行时工作正常,但如果我尝试使用ProcessBuilders自动启动类,则无法正常工作。

我真的希望你们能理解我想说的话。希望有人为我提供有效的解决方案。

干杯。

编辑:为HexagonRunner添加代码:

public class HexagonRunner extends GeneralAgent {

// Bunch of Methods
// Important Method:

    @Override
protected void simulationCycle() {

    turnAgent(40);


}
}

simulationCycle()方法,是一遍又一遍的方法。 由于HexagonRunner类继承自GeneralAgent类,我也会在这里发布这个类的相关内容:

public class GeneralAgent implements Runnable, UdpListener{

// Attributes, getters, setters, methods..

 @Override
 public final void run() {
    // giving the worker threads the signal to start
    mServerConnection.start();
    mParser.start();

    // waiting for the first information to be parsed, so that the
    // simulation loop can run
    try{
        System.out.println("GeneralAgent-Run: waiting for latch");
        mLogger.info("Run method: waiting for CountDownLatch");
        mFirstDone.await();
    }
    catch(InterruptedException e){
        System.out.println("GeneralAgent-Run: InterruptedException");
        mLogger.info("Run method error: " + e.getMessage());
    }
    mLogger.info("Run method: CountDownLatch now 0, continue");
    // setting the initial position
    moveToPostion(mXStartCoord, mYStartCoord);

    // the simulation loop

    while (true){
        simulationCycle();

        // Shutdown if the game is over
        if (mGameworld.getTime() >= 6000){ // later 6000+
            System.out.println("Yeah, 50 runs completed -> Shutdown");
            mLogger.info("General Agent - Time > 50, programm should terminate");
            shutdown();
            break;
        }
        // waiting for the threads to signal that they are
        // ready (e.g. have new server information)
        // for another round of the simulation loop
        mPhaser.arriveAndAwaitAdvance();
    }
}

我希望事情现在变得清晰起来。我仍然不知道我的代码在哪里失败。

1 个答案:

答案 0 :(得分:0)

使用Executors可以更简单地构建一些东西。它&#39; Java 1.5中引入的comcurrent包的一部分。它基本上如下工作:

// create a pool with 10 threads
ExecutorService executorService = Executors.newFixedThreadPool(10);
//loop as long as you need to detach your threads
for (int i = 0; i < 4; i++) {
    // this actually contains the thread bit, will be executed in parallel
    executorService.execute(new Runnable() {
        public void run() {
            // this is where your code is
            new HexagonRunner("127.0.0.1",6000,"UnitedTestors",-30,-15)
        }
    });
}
// clean up when you're done to prevent leaks
executorService.shutdown();

这很简单,你不需要通过ProcessBuilder生成不同的JVM,这会慢得多。