Java 线程启动方法的需求是什么?为什么没有唯一的运行方法?
通过start方法运行线程需要什么?为什么不直接调用run方法呢Java 线程启动方法的需求是什么?为什么没有唯一的运行方法?,java,multithreading,Java,Multithreading,通过start方法运行线程需要什么?为什么不直接调用run方法呢 What will happened if combined the code of start() and run() to make it as single method run() 不要解释这两种方法之间的区别,我想知道这个场景。run()方法定义线程将执行的操作start()方法启动线程以执行由run方法实现的任务 如果您直接调用run方法,它将由调用者线程执行。但是,start方法会导致在新启动的线程中处理任务。在
What will happened if combined the code of start() and run()
to make it as single method run()
不要解释这两种方法之间的区别,我想知道这个场景。run()
方法定义线程将执行的操作start()
方法启动线程以执行由run方法实现的任务
如果您直接调用run
方法,它将由调用者线程执行。但是,start
方法会导致在新启动的线程中处理任务。在前一种情况下,调用线程等待run方法完成。另一方面,在后一种情况下,新创建的线程以异步方式执行,因此调用线程在不等待run方法完成的情况下继续其作业 run()
方法定义线程将执行的操作start()
方法启动线程以执行由run方法实现的任务
如果您直接调用
run
方法,它将由调用者线程执行。但是,start
方法会导致在新启动的线程中处理任务。在前一种情况下,调用线程等待run方法完成。另一方面,在后一种情况下,新创建的线程以异步方式执行,因此调用线程在不等待run方法完成的情况下继续其作业 如果直接调用线程的run()方法,则该方法中的代码将在调用run()方法的线程中运行。调用start()将创建一个新线程,并在新线程上执行run()方法中的代码
简单地说,直接调用run()可能是一个错误,因为您实际上并没有创建新线程
请参阅以下链接以获取参考
如果直接调用线程的run()方法,则该方法中的代码将在调用run()方法的线程中运行。调用start()将创建一个新线程,并在新线程上执行run()方法中的代码 简单地说,直接调用run()可能是一个错误,因为您实际上并没有创建新线程 请参阅以下链接以获取参考 简单地说 调用
Thread.start
以启动新线程
如果您直接调用run
方法,那么它就像同一线程中的普通方法调用一样
哪些国家:
使该线程开始执行;Java虚拟机调用此线程的run
方法
请参阅Java教程
简单地说
调用Thread.start
以启动新线程
如果您直接调用run
方法,那么它就像同一线程中的普通方法调用一样
哪些国家:
使该线程开始执行;Java虚拟机调用此线程的run
方法
请参阅Java教程
您需要知道线程可以有不同的状态。基于此,线程有5种状态
- 新建-已创建线程并可以启动
- 可运行-线程正在执行
- 等待-线程正在等待其他线程完成;其他线程必须通过调用例如共享锁上的
方法来通知此线程它已完成notify
- 定时等待-与等待类似,但线程将在一段时间后自动停止等待,而不等待来自其他线程的信号
- 终止-线程完成其任务
run
方法只包含线程工作时(当线程处于可运行状态时)需要执行的代码
start
方法需要考虑将威胁状态从new
更改为runnable
,以便它可以开始工作并使用自己的资源(例如处理器时间)执行run
方法中的代码
调用yourThread.run()
时,调用此方法的线程将执行run
方法中的代码,但如果使用yourThread.start()
,则将使用yourThread
的资源执行run
方法中的代码
看看这个例子
public static void main(String[] args) {
System.out.println("main started");
Thread t = new Thread(){
public void run() {
try {Thread.sleep(2000);} catch (InterruptedException consumeForNow) {}
System.out.println("hello from run");
};
};
t.run();
System.out.println("main ended");
}
run
方法中的代码将暂停运行该方法的线程两秒钟(因为thread.sleep(2000);
),所以您可以在两秒钟后从run中看到hello
现在输出如下所示
main started
hello from run
main ended
因为run
方法中的代码是由主线程(处理publicstaticvoidmain(String[]args)
方法的线程)执行的,也因为两秒钟的暂停部分
hello from run
main ended
后来印刷的
现在,如果将t.run()
更改为t.start()
则run
中的代码将由t
线程执行。你们将通过观察结果看到它,这将是
main started
main ended
(来自主流)两秒钟后
hello from run
您需要知道线程可以有不同的状态。基于此,线程有5种状态
- 新建-已创建线程并可以启动
- 可运行-线程正在执行
- 等待-线程正在等待其他线程完成;其他线程必须通过调用例如共享锁上的
notify
方法来通知此线程它已完成
- 定时等待-与等待类似,但线程将在一段时间后自动停止等待,而不等待来自其他线程的信号
- 终止-线程完成其任务
run
方法只包含线程工作时(当线程处于可运行状态时)需要执行的代码