1.线程和进程的区别关系
首先要了解进程和线程,就要先了解什么是程序,程序就是指令集和数据的有序集合,其本身并没有运行的含义,是一个静态资源.
进程:进程是程序执行一次的过程,他是一个动态概念,是系统分配资源的一个单位.
线程 :通常一个进程中可以包含多个线程,一个进程至少含一个线程,线程是cpu调度和执行的单位…
其实真正的多线程指的是多核cpu,如果模拟出来的多线程,即在单核服务器下,同一个时间点,只能执行一行代码,只不过cpu切换速度很快.造成执行多线程的错觉.
创建线程有三种方式
- 第一种:继承Thread类
- 实现runnable接口
- 实现Callable接口
线程开启不一定马上执行,由cpu调度决定.但可以设置优先级
实现接口和实现类的对比:
Thread:
- 继承具备多线程的能力
- 启动线程,通过类的start()方法调用.
- 缺点是只能单继承,由局限性.不推荐使用
Runable:
- 实现接口具备多线程的能力
- 启动线程,通过new Thread(实现接口的类名),相当于静态代理
- 推荐使用该方法,避免了局限性,方便同一个对象被多个对象使用.
相当于一个资源,多个代理
2.线程的五大状态
创建,就绪,死亡,拥堵,运行;
3线程停止
官方文档不建议使用stop或者destroy方法停止.停止线程会导致它解锁所有已锁定的监视器.
建议使用标识符来停止.
4yield方法.
礼让线程,让当前正在执行的线程暂停,让线程从运行状态改成就绪状态.这个方法有着不确定性,完全取决于cpu调度.
5join合并线程
类似于插队.当子线程调用join方法后,必须等待子线程执行完毕主线程才能执行.
6线程优先级
java提供一个线程调度器监控启动后进入就绪状态的所有线程线程调度器通过优先级来决定哪个线程优先执行.
线程调度器优先级为1~10.
通过以下方法来得到或设置优先级
getpriority setPriority
设置优先级只不过是是被cpu调度的概率降低了,并不是优先级低就不会执行.
7守护线程daemon
线程分为用户线程和守护线程
虚拟机必须确保用户线程执行完毕
虚拟机不用等待守护线程执行完毕,即主线程执行完毕,守护线程也会停止,但不是立即停止.
如监控日志,垃圾回收,
setDaemon设置守护线程
8死锁
多线程各自占有一些资源,并且互相等待其他线程占有的资源才能运行,从导致两个或者多个线程互相等待对方释放资源都停止的情形某一个代码块同事拥有两个或者两个以上的锁时就可能发生死锁问题.
解决方法避免使用锁嵌套