java多线程基本面试题
目录
前言
多线程基本面试题上,多线程的创建、状态、方法全方面面试题总结
一、创建多线程的方式有哪些?
1.继承thread类,重写run方法
2.实现runable接口,重写run方法
3.实现callable接口,重写call方法,将实例化的对象交给Furntask进行管理
4.线程池创建线程对象
二、runable接口和callable接口有什么区别?
1.runable接口没有返回值
2.callable接口call方法有返回值,返回值为泛型,和FutureTask配合获取异步执行结果
3.callable接口call方法可抛出异常,runable的run方法只能内部消化,不可以上抛
三、run和start有什么区别?
1.start表示开启线程,通过线程的对象调用run方法中的逻辑代码,只能调用一次
2.run方法封装被线程执行的代码,可以调用多次
四、线程的状态之间是如何变化的?
1.创建对象->新建状态
2.start->可执行状态(就绪)
3.获取CPU,执行结束->终止状态
4.可执行状态中,没有获得锁->阻塞状态
5.可执行状态中,wait->等待状态
6.可执行状态中,sleep->计时等待状态
五、新建T1、T2、T3如何保证他们的顺序执行?
可以使用插入线程,在T3中使用T2.join,在T2中使用T1,.join来保证线程的顺序执行
六、notify()和notifyall有什么不同?
notify是唤醒随记一个wait线程
notifyall是唤醒所有wait线程
七、wait和sleep有什么异同?
1.wait和sleep都是让当前线程放弃CPU的执行权
2.sleep是Thread的静态方法,wait是Object的成员方法,每个对象都有
3.sleep(long)和wait(long)会在等待时间结束后醒来,wait(long)和wait()可以被notify唤醒
4.都可以被打断唤醒
5.wait方法调用必须先获取到wait对象的锁,sleep不用
wait方法执行后会释放对象的锁
sleep在sychronized代码块中执行,不会释放锁
八、如何停止一个正在运行的线程?
1.使用一个退出标致,如flag,使线程正常退出
2.使用stop方法强行退出,不推荐
3.使用interrupt中断线程
(1)打断为阻塞线程,sleep、wait、join等会抛出interruptedException异常
(2)打断正常的线程,根据打断状态标记的状态来退出线程
总结
多线程的创建方式,对其run、start、sleep和notify等方法的全方面面试题进行总结。