目前,我正在尝试编写一个程序,它应该多次执行单独的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();
}
}
我希望事情现在变得清晰起来。我仍然不知道我的代码在哪里失败。
答案 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,这会慢得多。