线程基础知识
进程与程序的区别
- 程序是一种静态概念,是保存在磁盘上的一系列文件
- 进程是一种动态概念,是运行中的程序,一个程序启动多个进程
进程与线程的区别
线程:
- 线程是CPU资源分配的最小单元
- 线程会共享进程中的内存,线程也有自己的独立空间(栈、程序计数器)
- 线程相互通信更加方便
进程:
- 进程是程序执行相关资源(内存,磁盘等)分配的最小单元
- 进程是一系列线程的集合
- 进程之间的资源是相互独立的
串行、并行和并发
- 串行:多个指令依次执行
- 并行:多个CPU内核同时执行多个线程,线程是同时执行的
- 并发:在极短时间内,cpu在多个线程间切换,但是任意时刻都只有一个线程在运行
线程状态
在java代码中,线程有六种状态
- NEW:Thread对象被创建出来,但是还没有执行start方法
- RUNNABLE:调用了start方法。cpu调度或者没有调度都是这个状态
- BLOCKED:一般没有拿到锁资源,会处于此状态
- WAITING:在调用wait方法后,会处于此状态,需要手动唤醒
- TIMED_WAITING:在调用sleep或者join方法后,会处于此状态,不用手动唤醒
- TERMINATED:线程资源被回收,生命周期结束
线程常用方法
currentThread方法
- 语法:Thread.currentThread()
- 含义:获取当前线程对象
setName方法
- 语法:线程对象.setName()
- 含义:设置线程名称
setPriority方法
- 语法:线程对象.setPriority()
- 含义:设置线程优先级
- 注意:优先级范围:1-10,值越大,优先级越高
yield方法
- 语法:Thread.yield()
- 含义:当前线程从运行状态变为就绪状态,让出cpu资源,但不会释放锁
sleep方法
- 语法:Thread.sleep(毫秒值)
- 含义:当前线程从运行状态变为TIMED_WAITING状态,但不会释放锁
join方法
- 语法1:线程对象.join()
- 含义:当前线程等待调用join方法的线程执行结束后才能往下执行,不会释放锁
- 语法2:线程对象.join(毫秒值)
- 含义:当前线程等待调用join方法的线程执行对应时间后才能往下执行,不会释放锁
setDaemon方法
- 语法:线程对象.setDaemon()
- 含义:调用方法的线程设置为守护线程
- 注意:JVM会在进程中没有普通线程时,结束掉JVM。由于主线程为普通线程,如果主线程结束,而JVM中也没有其他普通线程,JVM会直接停止,不会管守护进程有没有执行完任务。
stop方法
- 语法:线程对象.stop()
- 含义:强制让线程结束
- 注意:风险太大,一般不会使用
线程的等待和唤醒
wait方法可以让获得synchronized锁资源的线程释放锁,并且进入到锁的等待池中
notify或者notifyAll方法可以让获得synchronized锁资源的线程从等待池中被唤醒,进入锁池中
锁的等待池中的线程释放了锁资源,等待被唤醒。锁池中的线程已经被唤醒,会竞争锁资源,拿到锁资源后再执行代码
notify方法是随机唤醒一个线程,notifyAll方法是唤醒等待池中所有线程
调用wait、notify、notifyAll方法时,必须在synchronized修饰的代码块或者方法内才可以
线程中断
interrupt方法
- 语法:线程对象.interrupt()
- 含义:设置线程中断标志位为true
isInterrupt方法
- 语法:线程对象.isInterrupt()
- 含义:查看线程中断标志位,且返回
interrupted方法
- 语法:Thread.interrupted()
- 含义:查看线程中断标志位且返回,同时将标志位设置成false