这可能是一个基本问题,我对此感到困惑,
在一个文件中我喜欢这个:
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
答案 0 :(得分:17)
start()
在新帖子中运行run()
中的代码。直接调用run()
不会在新线程中执行run()
,而是调用线程run()
。
如果直接致电run()
,则表示您没有穿线。直接调用run()
将阻止,直到run()
中的任何代码完成为止。 start()
创建一个新线程,由于run
中的代码正在该新线程中运行,start()
会立即返回。 (嗯,技术上不是立即,而是在完成创建新线程并将其踢掉之后。)
答案 1 :(得分:2)
调用start()将创建一个新的执行线程,然后run()将在新创建的线程中执行
直接调用run()将执行当前线程中的代码
答案 2 :(得分:2)
run()方法:这是由你创建的线程执行的,它被分配处理器独立运行。
run()方法:从你的调用线程执行。
答案 3 :(得分:2)
您问题的简单答案是:
run():运行run()方法中的代码,阻塞直到完成
start():立即返回(不阻塞),另一个线程运行run()方法中的代码
答案 4 :(得分:2)
答案 5 :(得分:1)
在一行中直接调用run()
是 同步 (您的代码将阻止直到run()返回)并调用start()
(您的代码不会等待运行完成,因为在其他线程obj
中调用它是 异步 。
当您直接使用start()
方法时,线程将使用您提供给它的Runnable实例运行一次,然后该线程将无法使用。
但是为了利用Java中内置的线程池和调度功能,可以扩展Runnable或Callable。
答案 6 :(得分:1)
start()启动线程。 run()只是在当前线程中运行代码。