Java课程复习之线程
一、线程的概念
1.进程和线程
- 进程
一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间、一组系统资源,每一个进程的内部数据和状态都是完全独立的。 - 线程
Java程序执行中的单个顺序的流控制称为线程,多线程则指一个进程中可
以同时运行多个不同的线程,执行不同的任务。 - 线程与进程的区别
同类的多个线程共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多 。
2.多线程
- 采用多线程技术可提高cpu利用率,提高系统性能
二、线程的创建(分工)
1.Thread类
- 通过继承
Thread
类创建线程
2.Runnable接口
- 接口抽象方法:
public void run();
2.两种创建线程方法的比较
- 直接继承线程
Thread
类。但是该类无法继承其他类 - 实现
Runnable
接口。此种方法更加灵活,且多个线程可共享某个对象的资源
三、线程的控制与调度
1.线程的生命周期和状态的改变
2.线程调度与优先级
- 线程调度:当有多个线程处于就绪状态时,线程调度程序根据调度策略安排线程的执行
- 调度策略:
- 抢占式调度(preemptive): 支持基于固定优先级的调度算法,高优先级线程抢占低优先级线程执行;
- 时间片轮转调度(round-robin):对于同等优先级的线程,轮流分享CPU时间运行
- 线程优先级:
public static final int NORM_PRIORITY = 10;
public static final int MIN_PRIORITY = 1;
public static final int MAX_PRIORITY = 5;- 优先级高的线程只是比优先级低的线程更有机会执行,具体的执行情况还依赖于操作系统的支持,执行顺序并不是确定的
- 设置线程和返回线程的优先级方法:
public final void setPriority(int newPriority); // 设置线程的优先级。
public final int getPriority(); // 返回线程的优先级。
四、线程的同步机制(互斥)
1.线程安全
- 多个线程想要对某个对象进行并发更新操作,竞争共享资源,可能会产生不正确的结果。
- 多线程同时访问共享资源(变量),导致线程安全问题
- volatile:禁用CPU缓存 (可见性问题)
2.需要考虑线程安全问题的情形
- 数据单线程内可见
例如:线程的局部变量 - 只读对象
例如:String,Integer - 线程安全类
例如:StringBuffer - 如果多个线程想要对某个对象进行并发更新操作,但又不属于上述三类,此时需要考虑线程安全问题,实现安全的同步机制。
3.线程安全问题的解决措施
- 对象监视器(monitor)与synchronized
synchronized
的三种用法:- synchronized 代码块:监视器就是指定的对象.
同步块又称为临界区,保证同一时间只有一个线程执行同步块内的代码 - synchronized 方法:监视器就是this对象。
- synchronized 静态方法:监视器就是相应的Class对象
- synchronized 代码块:监视器就是指定的对象.
4.死锁问题
- 如果多个线程都处于等待状态,彼此需要对方所占用的监视器所有权,就构成死锁(deadlock),Java即不能发现死锁也不能避免死锁。
- 可能发生死锁的代码执行中不一定会死锁,因为线程之间的执行存在很大的随机性。
五、线程间的同步通信(协作)
- 使用
wait
和notifyAll
实现线程间同步通信