进程:正在运行中的程序
线程:线程共享存储空间,为了让多个方法能够同时运行
单线程的优点:安全,但是效率不行
多线程:效率高,但是会有潜在的问题
线程的运行模式
分时调度
平均分配时间
抢占模式
根据优先级分配不同的线程时间。
优先级高的程序占用更多的CPU时间。
main 的主线程
程序从上到下执行过程
- java demo
- 启动 JVM,运行 Demo.main
- JVM 运行方法 main,找操作系统,开线程
- 对于CPU有了一个执行的路径,运行方法main路径有个名字 "main"
Thread 类 线程
虚拟机允许线程并发运行多个程序
创建新执行线程有两种方法
一种将类申明为 Thread 子类
一种是重写 runnable 方法
线程继承 Thread
用 start 启动
会自动让虚拟机找到 run 方法
获取线程名字的方法 getName
每个线程都有默认的编号名称 Thread -0,1....
非静态
currentThread
jvm 开启主线程 Thread 类对象
static Thread currentThread() 返回正在执行的线程对象
setName
应该先改名,再开启线程
Thread.setName()
sleep
休眠制定方法
Thread.sleep(ms)
实现 runnable 接口
重写 run 方法
接口可以多实现; 继承只能单继承
实现 runnable 接口的好处
- 更加符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务
- 继承 Thread 类时,线程对象和线程任务耦合在一起,一旦创建Thread 类的子类任务,既是线程对象,又是线程任务。
- 实现Runnable 接口,将线程任务单独分离出来封装成对象,类型就是 Runnable 接口类型,Runnable 接口对线程对象和线程任务进行解耦。
高内聚,低耦合
让资源实现共享
匿名内部类实现多线程
节省代码,但是 格式比较奇怪
线程的状态
- new 至今尚未启动的线程: new Thread()
- runnable 运行状态,正在执行 start()
- terminated 死亡状态 run() 结束 stop()(不建议)
- blocked 受阻塞 和运行状态转换 取决于 CPU 运行状态
- timed waitting 休眠,一定时间之后会自动唤醒 运行 sleep 的状态、
-
waitting 无限的等待 使用 notify 进行 唤醒 在 object 类中
多线程状态转换.png
受阻塞: 线程具有 CPU 执行资格,等待 CPU 的资源
休眠等待:线程放弃CPU的执行资格
线程池
线程池基本概念
一个可以容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。
缓冲池 减少资源开销
新建和销毁线程,会造成较大的开销,需要减少这两种操作
JDK5 之后,内置了线程池
JDK5 中的线程池
使用工厂类
java
public class ThreadPoolDemo{
}