Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中调用thread.start()后,语句的流程是什么?_Java_Multithreading - Fatal编程技术网

在java中调用thread.start()后,语句的流程是什么?

在java中调用thread.start()后,语句的流程是什么?,java,multithreading,Java,Multithreading,在thread.start()之后执行什么语句。主线程的语句或子线程的语句 线程通常并行运行,但在这种情况下,总是主线程的语句优先于子线程的语句。实际原因或流程是什么 public class Test extends Thread { public static void main(String[] args) { ChildThread ct = new ChildThread(); ct.start(); System.out.

在thread.start()之后执行什么语句。主线程的语句或子线程的语句

线程通常并行运行,但在这种情况下,总是主线程的语句优先于子线程的语句。实际原因或流程是什么

public class Test extends Thread { 
    public static void main(String[] args) { 
        ChildThread ct = new ChildThread(); 
        ct.start();
        System.out.println("main"); 
    } 
} 
class ChildThread extends Thread{ 
    @Override public void run() {       
        System.out.println("Child thread"); 
    } 
}

这是因为在调用
ct.start()
之后,
JVM
调用
ct.run()
需要一些时间,因为运行新的
线程是一项繁重的操作。滞后时间足以打印“main”


但是,如果您尝试在循环中打印这两个线程,您将看到主线程没有优先权,因此无法确定在Thread.start()之后执行什么语句,但在大多数情况下,它将是主线程,因为当您启动新线程时,您的操作系统需要初始化此线程,当主线程已经在运行时。

对thread::start的调用意味着线程被放入处理器的队列中。在该调用之后,父线程和子线程并行运行。父线程立即执行System.out.println(“main”);子线程等待一个空闲处理器执行(我们可以假设总是有一个空闲处理器可用)。然后它执行一些系统工作:将处理器标记为已占用,将线程的状态更改为正在运行,然后将控制传递给run()方法,然后才是system.out.println(“子线程”);将执行。

o/p:主子线程它是不确定的。它可以是
main--Child-thread
Child-thread--main
(-表示新行。这取决于Child-thread何时运行,并且在您的情况下没有流控制,因此它是不确定的。为什么您认为它具有优先级?仅仅因为它打印了“main”首先?子线程需要在主线程已经运行时初始化并启动,当然它可以更早地完成任务。但是它的优先级并不比“子线程”高。因此,流将是父线程创建并调用子线程,并且在主线程下一次运行(打印)时,两个线程并行启动它们的语句调用,如果是线程,则执行其run函数。