Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程启动方法的需求是什么?为什么没有唯一的运行方法?_Java_Multithreading - Fatal编程技术网

Java 线程启动方法的需求是什么?为什么没有唯一的运行方法?

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方法会导致在新启动的线程中处理任务。在

通过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
方法会导致在新启动的线程中处理任务。在前一种情况下,调用线程等待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
方法只包含线程工作时(当线程处于可运行状态时)需要执行的代码