【问题标题】:I have two threads how do I know if they are running concurrently?我有两个线程,我怎么知道它们是否同时运行?
【发布时间】:2024-01-20 01:54:01
【问题描述】:

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

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

【问题讨论】:

  • 启动线程需要时间。你可以在一个线程中做很多工作,因为第二个结束开始了。顺便说一句,这意味着如果创建线程的工作超出了该线程的好处,则将工作传递给另一个线程并不总是有意义。

标签: java multithreading concurrency


【解决方案1】:

看起来是这样,因为第一个线程的输出太快了,以至于第二个线程还没有开始。如果您在 for 循环中执行 10000 次迭代,或者在第一个 for 循环中添加 Thread.sleep(1000);,您会看到它们是同时运行的。

【讨论】:

    【解决方案2】:

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


    你更广泛的问题很有趣。

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

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

    在实践中,时间片的粒度使得您通常可以看到行为的差异。但我认为您需要逐案评估可用的证据......结合特定应用程序的代码。

    【讨论】:

      【解决方案3】:

      在 java 文件夹的 bin 中有一个应用程序jvisualvm.exe(在 Windows 平台的情况下)。执行它,你就可以监控线程了。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          最近更新 更多