理解Java中的MultiThreading概念

Nir*_*mal 2 java multithreading

最近我经历了一个简单的线程程序,这导致我对相关概念的一些问题......我的示例程序代码如下所示:

class NewThread implements Runnable {
    Thread t;
    NewThread() {
        t = new Thread(this, "Demo Thread");
        System.out.println("Child thread: " + t);
        t.start(); // Start the thread
    }
    public void run() {
        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("Child Thread: " + i);
                Thread.sleep(500);
            }
        } catch (InterruptedException e) {
            System.out.println("Child interrupted.");
        }
        System.out.println("Exiting child thread.");
    }
}
class ThreadDemo {
    public static void main(String args[]) {
        new NewThread(); // create a new thread
        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("Main Thread: " + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("Main thread interrupted.");
        }
        System.out.println("Main thread exiting.");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在这个程序给我输出如下:

Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Main Thread: 4
Child Thread: 3
Child Thread: 2
Main Thread: 3
Child Thread: 1
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.
Run Code Online (Sandbox Code Playgroud)

所以,这对我来说非常清楚.但是,只要我将对象创建代码(调用NewThread类构造函数)替换为如下所示:

NewThread nt = new NewThread(); // create a new thread
Run Code Online (Sandbox Code Playgroud)

输出变得有点变化,如下所示:

Child thread: Thread[Demo Thread,5,main]
Main Thread: 5
Child Thread: 5
Child Thread: 4
Child Thread: 3
Main Thread: 4
Child Thread: 2
Child Thread: 1
Main Thread: 3
Exiting child thread.
Main Thread: 2
Main Thread: 1
Main thread exiting.
Run Code Online (Sandbox Code Playgroud)

有时它会在两种情况下给我相同的输出.所以,我没有得到这两个场景的确切变化.

我想知道你输出的变化来了吗?

提前致谢...

Tah*_*tar 5

更改的输出是由于OS进程调度和JVM线程调度的性质.即使您取出第二个线程,也无法保证您的线程在500ms后完全唤醒.