这可能是一个基本问题,我对此感到困惑,
在一个文件中,我有这样的:
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 不是创建线程? 这是我的猜测...希望更好地回答所以伙计们。谢谢
start()
在新线程中以run()
运行代码。 直接调用run()
不会在新线程中执行run()
,而是从中调用run()
线程。
如果直接调用run()
,则不会线程。 直接调用run()
将阻塞,直到run()
中的任何代码完成。 start()
创建一个新线程,并且由于 run
中的代码在该新线程中运行,因此start()
立即返回。 (好吧,从技术上讲,不是立即,而是在完成创建新线程并启动它之后。
此外,您应该实现可运行,而不是扩展线程。
调用 start() 将创建一个新的执行线程,然后 run() 将在新创建的线程中执行
其中直接调用 run() 将在当前线程中执行代码
你的问题的简单答案是这样的:
run():在 run() 方法中运行代码,阻塞直到它完成
start():立即返回(不阻塞),另一个线程运行 run() 方法中的代码
调用start
会启动线程。它执行基础工作以创建和启动新线程,然后在该新线程上调用run
。
调用run
只是调用当前线程上的 run
方法。您从不直接呼叫run
,请使用start
.
-
调用 start() 后 run() 方法:这是由您创建的线程执行的,它被分配处理器以独立运行。
-
你调用的 run() 方法:从你的调用线程执行。
在一行中直接调用run()
是同步的(你的代码将阻塞直到 run() 返回)和调用start()
(你的代码不会等待运行完成,因为它在其他线程obj
中被调用)是异步的。
当您直接使用start()
方法时,线程将使用您提供给它的 Runnable 实例运行一次,然后线程将不可用。
但是,要利用 Java 中内置的线程池和调度功能,扩展 Runnable 或 Callable 是要走的路。
start() 启动线程。 run() 只是在当前线程中运行代码。