当前位置: 首页 > 科技观察

为什么启动线程不直接调用run(),而要调用start(),如果调用两次start()方法会有什么后果

时间:2023-03-12 09:50:11 科技观察

为什么启动线程不直接调用run(),而是调用start()?如果两次调用start()方法会发生什么?一道面试题,说为什么启动一个线程不直接调用run()方法,而是调用start()方法启动,调用两次start()会怎样?如果你被问到这样的采访,你能回答吗?今天,我就和大家分享一下我对这个问题的理解。1、run()和start()的区别首先回答为什么启动线程不能直接调用run()方法,而是调用start()方法,我从以下四个方面来回答:1st:start()方法是Java线程契约的内置方法,可确保代码在新的线程上下文中运行。第2步:start()方法包含触发创建新线程的特殊代码逻辑。run()方法是自己写的代码,显然没有这个能力。第三步:如果直接调用run()方法,只是普通的方法调用。程序中仍然只有一个主线程,只能顺序执行。您需要等待run()方法结束才能执行以下代码。第四:创建线程的目的是为了充分利用CPU资源。如果我们直接调用run()方法,就失去了创建线程的意义。2、调用两次start()的后果知道了run()方法和start()方法的区别,如果调用两次start()方法会有什么后果呢?在Java中,线程的start()方法只能调用一次。如果第二次调用将抛出IllegalThreadStateException,则这是一个运行时异常。多次调用start被认为是编程错误。在Java中,线程的运行状态被定义为五个枚举值,分别是:(1)新建(NEW),线程已经创建,但是还没有调用start()方法启动。(2)就绪(RUNNABLE),处于该状态的线程可能正在运行,也可能还在就绪队列中,等待系统分配CPU资源。在操作系统中,有一个额外的区分叫做RUNNING,但是从JavaAPI的角度来说,是无法表达的。(3)阻塞(BLOCKED),表示线程正在等待MonitorLock。(4)等待(WAITING),表示线程处于条件等待状态,当条件触发时会被唤醒。比如等待/通知等。(5)定时等待(TIMED_WAIT),与WAITING状态相同,只是多了一个超时条件触发机制。(6)终止(TERMINATED),表示线程执行结束。在JavaAPI中,影响线程运行状态的因素如图所示:当我们第一次调用start()方法时,线程可能处于终止状态或其他非NEW状态,而当再次调用start()方法时,相当于让正在运行的线程再次运行。无论是从线程安全的角度,还是线程本身的执行逻辑,都是不合理的。所以,为了避免这个问题,Java会先判断当前线程的运行状态。好了,以上就是我对Java线程的start()方法和run()方法的理解。