Java 多线程
在这两种方法中,我们都覆盖了run()函数,但是我们通过调用start()函数来启动一个线程。那么为什么我们不直接调用oveerridden run()函数呢?为什么总是调用start函数来执行一个线程?
调用start()函数时会发生什么?
调用函数时,将执行以下操作:
参数被评估。
新的堆栈帧被推入调用堆栈。
参数已初始化。
方法体被执行。
值被重新调整,当前堆栈帧从调用堆栈中弹出。
start()的目的是为线程创建一个单独的调用堆栈。它创建一个单独的调用堆栈,然后由JVM调用run()。
start()函数在Java多线程的示例
让我们看看如果我们不调用start()而是直接调用run()会发生什么。
// Java code to see that all threads are
// pushed on same stack if we use run()
// instead of start().
class ThreadTest extends Thread
{
public void run()
{
try
{
// Displaying the thread that is running
System.out.println ("Thread " +
Thread.currentThread().getId() +
" is running");
}
catch (Exception e)
{
// Throwing an exception
System.out.println ("Exception is caught");
}
}
}
// Main Class
public class Main
{
public static void main(String[] args)
{
int n = 8;
for (int i=0; i
{
ThreadTest object = new ThreadTest();
// start() is replaced with run() for
// seeing the purpose of start
object.run();
}
}
}
输出:
Thread 1 is running
Thread 1 is running
Thread 1 is running
Thread 1 is running
Thread 1 is running
Thread 1 is running
Thread 1 is running
Thread 1 is running
我们可以从上面的输出中看到,我们为所有线程获得了相同的ID,因为我们直接调用了run()。调用start()的程序会打印不同的ID.