Java多线程与For循环问题

Java多线程与For循环问题,java,multithreading,Java,Multithreading,我有个奇怪的问题 我创建并运行一个新的线程,如下所示: for (int i = 0; i < TIMES_TO_CALL_PING; i++) { new Thread(new Runnable() { public void run() { try { Process p = Runtime.getRuntime().exec(

我有个奇怪的问题

我创建并运行一个新的
线程
,如下所示:

for (int i = 0; i < TIMES_TO_CALL_PING; i++) {
        new Thread(new Runnable() {
            public void run() {
                try {
                    Process p = Runtime.getRuntime().exec(
                            "ping -l " + PACKET_SIZE + " -n "
                                    + TIMES_TO_PING_PER_CALL + " "
                                    + ADDRESS);

                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(p.getInputStream()));

                    String input;
                    while ((input = in.readLine()) != null) {
                        if (input.contains("time=")) {
                            totalPingTime += Integer.parseInt(input
                                    .split("time=")[1].split("ms")[0]);
                            average = (double) (totalPingTime / index);
                            pingTime.setText("Average Ping Time: "
                                    + average + "ms");

                            System.out.println(index);
                        }
                        output.append(input + "\n");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        index = i;
        pingCount.setText("Pings called: " + (i + 1));
        frame.pack();
    }
for(int i=0;i
程序的输出为:


请注意程序如何永远打印“9999”(它从不停止),以及数字的顺序如何不同,如1、2、3、4、5。为什么会这样

为了
在线程启动时捕获每个线程的变量值,请将线程实例化重写为以下内容:

class OVThread extends Thread {

    int index;

    public OVThread(int index, Runnable target) {
        super(target);
        this.index = index;
    }

}
现在您可以这样使用它:

for (int i = 0; i < TIMES_TO_CALL_PING; i++) {
    new OVThread(index, new Runnable() {

            @Override
            public void run() {
                try {
                    ...
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    ...
}
for(int i=0;i
为什么您认为应该订购?您正在运行多个线程,这些线程同时打印到控制台…您需要先声明它,而不是期望我们从代码中推断您的意图。我很确定你的意图和代码所做的是两件不同的事情。你为什么要使用多线程呢?您似乎正在创建大量同时运行的线程,以及所有运行“ping”进程的线程,这些线程都将向同一地址发出ping请求。这样做有目的吗?如果不知道你希望实现什么目标,我认为我们无法真正帮助你解决问题。