n_g*_*n_g 11 multithreading java-me
如果线程的start()方法在内部调用run()方法,那么为什么我们不直接在代码中调用run()方法呢?这样做涉及哪些问题?
Rob*_*edy 17
该start
方法确保代码在新的线程上下文中运行.如果你run
直接调用,那么它就像一个普通的方法调用,它将在当前线程的上下文中运行,而不是在新线程的上下文中运行.该start
方法包含触发新线程的特殊代码; run
显然没有这种能力,因为你在编写run
方法时没有包含它.
当我们在线程对象上调用start()方法时,start()方法通过为该线程创建一个新的调用堆栈来启动新的执行线程。start()导致该线程开始执行并进行Java虚拟机调用此线程的run()方法。如果我们调用run()而不是start()怎么办:
尽管这是合法的,但是run()方法将进入当前的调用堆栈,而不是创建新的调用堆栈。
例如,如果当前正在执行的方法是main,则创建的调用堆栈为:
class MyThread extends Thread
{
public void run()
{
System.out.println("running");
}
}
public class ThreadDemo
{
public static void main (String[] args )
{
MyThread thread=new MyThread();
thread.start();
}
}
Run Code Online (Sandbox Code Playgroud)
新线程的调用堆栈(start()方法创建了新的调用堆栈)调用堆栈-主线程
class MyThread extends Thread
{
public void run()
{
System.out.println("running");
}
}
public class ThreadDemo
{
public static void main (String[] args )
{
MyThread thread=new MyThread();
thread.run();
}
Run Code Online (Sandbox Code Playgroud)
}
run()方法不会为该线程创建新的调用堆栈。run()方法进入当前调用堆栈