在java中调用thread.start()后,语句的流程是什么?
在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.
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函数。