Java线程start()vs run()方法及示例

Java | 线程start()run()方法

当我们调用该start()方法时,它将导致创建新线程。然后,它会自动调用该run()方法。如果我们直接调用该run()方法,则不会创建新线程。该run()方法将仅在当前线程上执行。

这就是为什么我们能够多次调用run方法的原因,就像我们创建的任何其他方法一样。但是,该start()方法只能调用一次。

请看以下代码:

class MyThread extends Thread { 
	public void run() 
	{ 
		System.out.println("Thread Running: " + Thread.currentThread().getName()); 
	} 
} 

public class MyProg { 
	public static void main(String[] args) 
	{ 
		MyThread t1 = new MyThread(); 
		t1.start(); 
	} 
}

输出结果

Thread Running: Thread-0

我们可以清楚地看到,run()方法是在新线程上调用的,默认线程名为Thread-0

请看以下代码:

class MyThread extends Thread { 
	public void run() 
	{ 
		System.out.println("Thread Running: " + Thread.currentThread().getName()); 
	} 
} 

public class MyProg { 
	public static void main(String[] args) 
	{ 
		MyThread t1 = new MyThread(); 
		t1.run(); 
	} 
}

输出结果

Thread Running: main

我们可以看到在这种情况下,我们直接调用run()方法。在当前正在运行的线程-main 上调用它,并且不创建新线程。

同样,在下面的代码中,我们意识到我们只能调用一次start方法。但是,可以将run方法多次调用,因为它将被视为常规函数调用。

class MyThread extends Thread { 
	public void run() 
	{ 
		System.out.println("Thread Running: " + Thread.currentThread().getName()); 
	} 
} 

public class MyProg { 
	public static void main(String[] args) 
	{ 
		MyThread t1 = new MyThread(); 
		t1.run();
		t1.run();
		t1.start();
		t1.start();
	} 
}

输出结果

Thread Running: main
Thread Running: main
Thread Running: Thread-0

Exception in thread "main" java.lang.IllegalThreadStateException
	at java.base/java.lang.Thread.start(Thread.java:794)