目录
一、线程与进程的区别
分析:
进程是资源分配的最小单位,线程是CPU调度的最小单位。
- 进程是资源调度的最小单位,所有与进程相关的资源,都被记录在进程控制块PCB中
- 进程是抢占处理机的调度单位,它拥有一个完整的虚拟内存地址空间,进程发生调度时,不同进程拥有不同虚拟地址空间,同一进程内的不同线程共享同一地址空间。线程与资源分配无关,它属于某个进程,共享其资源。
- 线程只由堆栈寄存器、程序计数器和线程控制块TCB组成
总结:
Java中进程和线程的关系
二、Thread中start和run方法的区别
分析:
start方法源码中有一个start0方法,是一个native方法,可在openjdk网站中查看。start0中又调用了JVM的StartThread方法,该方法会创建一个新的线程,并调用run方法。
总结:
- start方法会创建一个新的子线程并启动
- run方法只是Thread的一个普通方法调用,还是在主线程中执行
三、Thread和Runnable的区别
- Thread是一个实现了Runnable接口的类,Runnable接口中只有一个抽象的run方法。Thread通过start给Runnable的run方法实现了多线程。
- 因Java单一继承,推荐使用Runnable。
四、如何实现处理线程的返回值
如何给run()方法传参:
- 构造函数传参
- 成员变量传参
- 回调函数传参
如何实现处理线程返回值:
1.主线程等待法,让主线程循环等待,直到子线程返回值为止。
while(xxxx){
Thread.currentThread.sleep(100);
}
优点是实现简单,缺点是需要自己实现循环等待的逻辑,且无法精准控制(等待多久不确定)
2.使用Thread类的join方法阻塞当前线程以等待子线程处理完毕。
优点:实现更简单,控制更精准,缺点是力度不够细。
3.通过Callable接口实现:通过Future Task或者线程池获取
五、Java线程的六种状态
Thread类中有一个枚举类型state,其中包括六种:
1.新建(New):创建后尚未启动的状态
2.运行(Runnable):包含操作系统线程状态的Running和Ready
3.无限期等待(Waiting):不会被分配CPU时间,需要被显式唤醒
- 没有设置Timeout参数的Object.wait()方法
- 没有设置Timeout参数的Thread.join()方法
- LockSupport.park()方法
4.限期等待(Timed Waiting):也不会被分配CPU时间,但一定时间后会被系统自动唤醒
- Thread.sleep()方法
- 设置Timeout参数的Object.wait()方法
- 设置Timeout参数的Thread.join()方法
- LockSupport.parkNanos()方法(需要传时间参数)
- LockSupport.parkUntil()方法(需要传时间参数)
5.阻塞(Blocked):等待获取排它锁
6.结束(Terminated):已终止线程的状态
六、sleep和wait的区别
基本差别:
- sleep是Thread类的方法,wait是Object类中的方法。
- sleep可以在任何地方使用,wait只能在synchronize方法或synchronize块中使用
最主要的本质差别:
sleep只会让出CPU,不会改变锁行为
wait不只让出CPU,还释放已经占用的同步资源锁
七、notify和notifyall的区别
两个概念:锁池EntryList,等待池WaitSet
区别:
八、yield函数
作用:暗示调度器自己愿意让出CPU,但结果取决于调度器。
九、interrupt函数
如何中断线程:
(已经被抛弃的方法:stop。太暴力、不安全。类似的还有suspend和resume方法)
目前使用的方法是interrupt,也是一种暗示,通知线程应该被中断,如何处理由被通知的线程自己处理。
①如果线程处于被阻塞状态,那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。
②如果线程处于正常活动状态,那么会将该线程的中断标志设置为true。被设置中断标志的线程将继续正常运行,不受影响。
③在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程。
十、总结