1. 多线程的三种实现及java多线程的实现
详解见:
https://blog.csdn.net/nalanmingdian/article/details/77748326
java 使用用户线程加轻量级进程混合实现,且采用1对1模型,其中兼顾实现复杂度及跨平台性。
由于仅使用用户线程,则线程相关的调度、切换即CPU映射等复杂操作都需要考虑所以在java 1.2 后就不在使用了,
而使用用户线程加轻量级进程混合实现,可以使java 开发者仅关注用户线程内的逻辑处理,对于与轻量级进程相关的系统调用,线程上下文切换等则可以都交由JVM处理,这样可以很好的兼顾实现复杂度及跨平台性,所以java最终没有选择直接暴露内核级线程的接口轻量级进程(LWP),而是暴露一个java线程对象。
2.线程的创建、启动、执行和结束
线程的创建:
两种创建方式:1. 继承Thread类,作为Thread子类 2.创建Runnable接口实例,通过实例创建线程类。
从面向对象的角度看:第一种属于继承方式,第二种属于组合方式,推荐第二中,耦合性更低。
从对象共享角度看:第二种可以多个线程共享一个Runnable实例,实现多线程并发处理。
线程的启动:
Thread类的start方法会触发线程的启动,不仅仅是java线程的启动,同时还会触发与java线程中对应的宿主机上线程的启动,所以创建java线程对象的代价更高。
start方法调用结束并不意味着相应的线程已经开始运行,仅仅是线程准备就绪,何时运行由线程调度器决定。
线程的执行:
Thread类的run方法执行具体的线程逻辑,而且此方法总是由java虚拟机直接调用。
如果java代码直接调用run方法则代码并不是在新创建的线程上执行,而是在调用方所在的线程上执行,相当于简单的java方法调用。
线程的结束
run方法执行完毕,线程运行结束,运行结束的线程所占用的资源(如内存空间)会如同其他Java对象一样被JVM虚拟机垃圾回收
3. 线程饥饿:
某些线程永远得不到运行机会,可能由于优先级使用不当导致内核线程调度器一直不调度此线程。
4.守护线程和用户线程
用户线程:用户线程会阻塞java进程的正常终止,即一个java进程中,只有所有的用户线程都终止,java进程才能正常终止。
守护线程:守护线程不会阻塞java进程的正常终止,即一个java进程中,活跃的线程只是守护线程,java进程能正常终止。
5.线程的生命周期状态
详解见:
https://blog.csdn.net/nalanmingdian/article/details/77748326