通过调用start()和run()来运行Thread,有什么区别?
这可能是一个基本问题,我对此感到困惑,
在一个文件中,我喜欢这样:
public class MyThread extends Thread { @Override public void run() { //stuffs } }
现在在另一个文件中我有这个:
public class Test { public static void main(String[] args) { Thread obj = new MyThread(); //now cases where i got confused //case 1 obj.start(); //it makes the run() method run //case 2 obj.run(); //it is also making run() method run } }
那么在上面两种情况之间有什么区别,是情况1是创建一个新线程而情况2是不是创建一个线程? 这是我的猜测…希望能更好地回答SO guys.Thanks
start()
在新线程中run()
中的代码。 直接调用run()
不会在新线程中执行run()
,而是从中调用线程run()
。
如果直接调用run()
,则表示没有线程化。 直接调用run()
将阻塞,直到run()
任何代码完成。 start()
创建一个新线程,并且由于run
的代码在该新线程中run
, start()
立即返回。 (嗯,技术上不是立即,而是在完成创建新线程并将其踢掉之后。)
此外,您应该实现runnable,而不是扩展线程 。
调用start()将创建一个新的执行线程,然后run()将在新创建的线程中执行
直接调用run()将执行当前线程中的代码
你的问题的简单答案是这样的:
run():运行run()方法中的代码, 阻塞直到它完成
start(): 立即返回(不阻塞) ,另一个线程在run()方法中运行代码
调用start
启动线程。 它执行创建和启动新线程的基础工作,然后调用在该新线程上run
。
调用run
只调用当前线程上的 run
方法。 你永远不会直接调用run
,使用start
。
-
调用start()后的run()方法:这是由你创建的线程执行的,它被分配处理器独立运行。
-
你调用的run()方法:从你的调用线程执行。
在一行中直接调用run()
是同步的 (你的代码将阻塞直到run()返回)并且调用start()
(你的代码不会等待运行完成,因为它在其他线程obj
被调用)是异步的 。
当你直接使用start()
方法时,线程将使用你提供给它的Runnable实例运行一次,然后线程将无法使用。
但是为了利用Java内置的线程池和调度function,扩展Runnable或Callable是可行的方法。
start()启动线程。 run()只是在当前线程中运行代码。