多线程
使用多线程可以提高cpu的利用率,可以让程序充分利用cpu资源,解决高并发带来的负载均衡问题。
优点:
- cpu资源得到合理的利用
- 代码更加简洁
- 让程序运行的更有效率,响应更快
缺点:
- 需要更多的内存空间
- 并行访问可能影响数据的准确性
- 数据被多线程共享,可能出现死锁的情况
进程
讲到线程肯定要提到进程,那什么是进程?
简单的来说进程就是计算机正在运行的一个应用程序。线程是进程的基本单位,程序执行的最小单位,为独立完成程序中的某个功能而存在,一个进程是由一个或多个线程组成。
进程和线程的区别
进程:运行时拥有独立内存,每个进程互不干扰。
线程:共享内存,运行必须依赖进程,不能独立执行,而且还有执行的入口和出口。
线程的使用
- 继承Thread类
- 创建自定义类并继承Thread
- 重写Thread的run方法
- 实现Runnable接口
- 创建自定义类并实现Runnable接口
- 实现run方法
线程的5种状态
- 创建状态
- 就绪状态
- 运行状态
- 阻塞状态
- 终止状态
线程调度
线程休眠
线程暂停执行,让程序进入阻塞状态,cpu资源分给其他线程。
sleep()
线程合并
让某一个线程合并到当前线程,交替执行变成顺序执行,调用join方法来实现。
线程礼让
在某个时间点暂停争夺cpu资源,进入阻塞状态,但这只是一时的,时间点过后会重新加入争夺cpu资源,调用yield方法来实现。
线程中断
线程因为某个原因中断,不再加入争夺cpu资源的行列;
- 手动暂停 public boolean isInterrupt()
- 执行完毕后自动停止 public void stop()
- 执行过程中出现错误 public void interrupt()
线程同步
synchronized方法
通过jvm实现
java对象的内置锁,内置锁会保护被synchronized关键字修饰的方法。
线程安全的单例模式
一个类只能有一个实例对象,由多个线程来共享该实例对象的资源。
死锁
死锁是一种错误,在实际开发中应当避免
重入锁
是synchronized的升级版,通过jdk实现。
特点
- 可以给同一个资源添加多把锁,完事后需要手动解锁
- 可中断,在线程等待获取锁的过程中可以主动终止,通过lockInterruptibly()来实现。
- 具备限时性的特点,可以判断某个线程在一定时间内是否可以获取锁,通过调用tryLock(long timeout<时间数值>,TimeUint unit<时间单位>),返回值是boolean:true表示某段时间可以获取锁,false则反之。