多线程
多线程概念
一个Java程序实际上是一个JVM进程,JVM进程用一个主线程来执行main()
方法,在main()
方法内部,我们又可以启动多个线程。此外,JVM还有负责垃圾回收的其他工作线程等。
并发和并行
- 并发:单核心CPU运行多线程就是并发,并发在微观来说是CPU在同一时刻只能有一个任务在执行
- 并行:多核心CPU运行多线程程序就是并行,并行在微观来说是CPU在同一时刻有多个任务在执行
线程常用方法
-
currentThread(),当前线程
-
getId(),获取线程唯一编号
-
setName()/getName(),线程名称
-
start(),开启新的线程
-
run(),在当前线程中执行
-
isAlive(),线程活动状态
-
sleep(),属于Thread 的方法,休眠毫秒,不释放锁
-
yield(),属于Thread 的方法,交出cpu使用权,不释放锁
-
join(),属于Thread 的方法,让调用join方法线程先执行完成,不释放锁
-
wait(),属于Object 方法,进入等待状态,释放锁。
-
notify(),属于Object 方法,唤醒(对象监视器)单个线程,释放锁。
-
notifAll(),属于Object 方法,唤醒(对象监视器)等待全部线程,释放锁。
-
setPriority(num),设置线程优先级(1-10)
-
interrupt(),中断线程,只是打一个中断标记,并不是真正的停止
-
isInterrupted(),线程中断标记。循环体中break;return;进行中断。
-
setDaemon(),守护线程,垃圾回收器就是守护线程,守护线程不能单独执行,只剩守护线程会自动销毁,监控别的线程,main线程结束,守护线程也结束了。
线程生命周期介绍
-
NEW,新建状态,调用start()启动之前
-
RUNNABLE,可运行状态,复合状态包括(READY,RUNNING)READY可以被线程调度器进行调度,RUNNING 标识该线程正在执行。Thread.yield(),可以把线程从RUNNING状态修改成READY状态
-
BLOCKED,阻塞状态,线程发起阻塞IO请求,申请独占资源(申请锁),进入阻塞状态,不会占用CPU资源,线程获得申请的资源,转换成RUNNABLE状态。
-
WATTIING,等待状态,想成执行了wait,join方法,会把线程转换成 等待状态,执行了notify,方法或者加入的线程执行完毕,当前线程转换为 RUNNABLE状态
-
TIMED_WAITING,超时等待,调用Thread.sleep(long),或者wait(long),进入超时等待状态。不会无限等待,没有在指定时间完成期望操作,自动转换为RUNNABLE
-
TERMINATED,终止状态