每天5道java面试题 -8(多线程)

本文详细介绍了Java中线程的启动与执行原理,强调start()与run()的区别,指出start()会启动新线程并执行run(),而直接调用run()仅在当前线程执行。线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED状态,阐述了状态转换。此外,讨论了线程池在队列满时的处理策略,包括无界队列与有界队列的区别。
摘要由CSDN通过智能技术生成

1.启动线程方法start()和run()方法有什么不同?

        每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,run()方法称为线程 体。通过调用Thread类的start()方法来启动一个线程。

        start() 方法用于启动线程, run() 方法用于执行线程的运行时代码。 run() 可以重复调用,而 start() 只能调用一次。
        start()方法来启动一个线程,真正实现了多线程运行。调用 start() 方法无需等待run方法体代码执 行完毕,可以直接继续执行其他的代码; 此时线程是处于就绪状态,并没有运行。 然后通过此 Thread 类调用方法 run() 来完成其运行状态, run() 方法运行结束, 此线程终止。然后 CPU 再调度
其它线程。
        run()方法是在本线程里的,只是线程里的一个函数,而不是多线程的。 如果直接调用 run(),其实 就相当于是调用了一个普通函数而已,直接待用 run() 方法必须等待run()方法执行完毕才能执行下 面的代码,所以执行路径还是只有一条,根本就没有线程的特征,所以在多线程执行时要使用 start() 方法而不是 run() 方法。

2.为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?

        这是另一个非常经典的 java 多线程面试问题,而且在面试中会经常被问到。很简单,但是很多人都回答不上来!
        new 一个 Thread ,线程进入了新建状态。调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到 时间片 后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。 而直接执行 run() 方法,会把 run 方法当成一个 main 线程下的普通方法去执行,并不会在某个线 程中执行它,所以这并不是多线程工作。
        总结: 调用 start 方法方可启动线程并使线程进入就绪状态,而 run 方法只是 thread 的一个普通方法调用,还是在主线程里执行。

3.一个线程的生命周期有哪几种状态?他们之间如何流转的?

        NEW:表示的是刚创建的线程,还没有开始启动。

        RUNNABLE:表示线程已经触发start()方法调用,线程正式启动,线程处于运行中状态。

        BLOCKED:表示线程阻塞,等待获取锁,如碰到synchronized、lock等关键字等占用临界区的情况,一旦获取到锁就进行RUNNABLE状态继续执行。

        WAITING:表示线程处于无限制等待状态,等待一个特殊的事件来重新唤醒,如通过wait()方法进行等待的线程等待一个notify()或者notifyAll()方法,通过join()方法进行等待的线程等待目标线程运行结束而唤醒,一旦通过相关事件唤醒线程,线程就进入了RUNNABLE状态继续运行。

        TIMED_WAITING:表示线程进入了一个有时限的等待,如sleep(3000),等待3秒后线程重新进行RUNNABLE状态继续运行。

        TERED_WAITING:表示线程执行完毕后,进行中止状态。需要注意的是,一旦线程通过start方法启动后就再也不能回到初始NEW状态,线程终止后也不能再回到RUNNABLE状态。

4.提交任务时线程池队列已满时会发生什么?

        当线程数小于最大线程池数 maximumPoolSize 时就会创建新线程来处理,而线程数大于等于最大线程池数 maximumPoolSize 时就会执行拒绝策略。

5.如果你提交任务时,线程池队列已满,这时会发生什么?

        有俩种可能:
        1)如果使用的是无界队列 LinkedBlockingQueue,也就是无界队列的话,没关系,继续添加任务到 阻塞队列中等待执行,因为 LinkedBlockingQueue 可以近乎认为是一个无穷大的队列,可以无限存放任务
         2)如果使用的是有界队列比如 ArrayBlockingQueue ,任务首先会被添加到ArrayBlockingQueue 中, ArrayBlockingQueue 满了,会根据 maximumPoolSize 的值增加线程数量,如果增加了线程数量 还是处理不过来, ArrayBlockingQueue 继续满,那么则会使用拒绝策略RejectedExecutionHandler处理满了的任务,默认是 AbortPolicy
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

差点资深程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值