我有两个线程如何知道它们是否同时运行?

时间:2013-12-20 10:44:00

标签: java multithreading concurrency

我正在尝试创建两个并发运行的线程如何测试它们是否正在并行运行它在当前线程结束后线程正在运行的输出中的接缝?这是在发生这种情况还是在同时发生?

public class Start {

public static void main(String[] args) {
    new ThreadOne();
    Thread t = Thread.currentThread(); // Static Method
    t.setName("Thread One");
    System.out.println(t);

        for(int i = 0; i<=100; i++) {
            System.out.println("Main Thread: " + i);
        }

    }

}

public class ThreadOne implements Runnable {
Thread t;
public ThreadOne() {
    t =new Thread(this, "Demo Thread");
    System.out.println("Child Thread" + t);
    t.start();
}
@Override
public void run() {
    for(int i = 0; i<=100; i++) {

            System.out.println("Child Thread: " + i);

    }

}

}

输出

Main Thread: 0
Main Thread: 1
Main Thread: 2
Main Thread: 3
Main Thread: 4
Main Thread: 5
Main Thread: 6
Main Thread: 7
Main Thread: 8
Main Thread: 9
Main Thread: 10

Child Thread: 0
Child Thread: 1
Child Thread: 2
Child Thread: 3
Child Thread: 4
Child Thread: 5
Child Thread: 6
Child Thread: 7
Child Thread: 8
Child Thread: 9
Child Thread: 10

4 个答案:

答案 0 :(得分:2)

这看起来像是因为第一个线程的输出太快而没有开始。如果你在for循环中进行10000次迭代,或者在第一个for循环中添加Thread.sleep(1000);,你会发现它们是同时运行的。

答案 1 :(得分:1)

在这种情况下,看起来主线程在子线程启动之前完成。并且代码中没有任何内容可以要求同时或交错执行两个线程。


你更广泛的问题很有意思。

  

我正在尝试创建两个并发运行的线程,如何测试它们是否并发运行

我实际上并不认为确定测试是否可以测试或证明应用程序中的两个线程实际上同时运行。据我所知,任何外部可观察的执行模式都可以由同时执行(逐字)的线程生成,理论上也可以由具有单核的系统上的时间切片线程生成。 / p>

实际上,时间切片的粒度使得通常可以看到行为的差异。但我认为您需要根据具体应用的代码逐案评估现有证据。

答案 2 :(得分:0)

在java文件夹的bin中有一个应用程序jvisualvm.exe(在Windows平台的情况下)。执行该操作,您将能够监视线程。

答案 3 :(得分:0)

他们同时运行。我已经尝试过代码并确定它是。我认为你应该看到更多的输出。您向我们展示的输出只是打印十次。它不能说实话。你可以改变100到1000,然后你会发现真相。