线程
进程:是正在运行的程序
线程:是进程中的单个控制流,是一条执行路径;
单线程:一个进程只有一个执行路径,以前用的main方法
多进程:一个进程有多条执行路径
实现多进程的方法
1.继承Thread类;
1-1实现步骤
1.1定义一个类MyThread继承Thread类
1.2在MyThread类中重写run()方法
1.3创建MyThread类的对象
启动线程
1-2
两个小问题
- 为什么要重写run()方法?
因为run()是用来封装被线程执行的代码
run()方法和start()方法的区别?
run():封装线程执行的代码,直接调用,相当于普通方法的调用
start():启动线程;然后由JVM调用此线程的run()方法
1-3设置和获取线程名称
void setName(String name):将此线程的名称更改为等于参数name
String getName():返回此线程的名称
Thread currentThread():返回对当前正在执行的线程对象的引用
1-4线程优先级
1.4线程调度
两种调度方式
分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些
Java使用的是抢占式调度模型
随机性:假如计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性,因为谁抢到CPU的使用权是不一定的
final int getPriority()
返回此线程的优先级
final void setPriority(int newPriority)更改此线程的优先级
主机的优先级是Thread .currentThread.getPriority()
线程默认优先级是5;线程优先级的范围是:1-10
1-5线程控制
static void sleep(long millis)
使当前正在执行的线程停留(暂停执行)指定的毫秒数
void join()
等待这个线程死亡 写在第一个位置否则join会失去作用
void setDaemon(boolean on)
将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
1-6线程的生命周期
新建- start()-》就绪《----有执行资格没执行权--《(阻塞)《----》运行--有执行资格有执行权-》死亡
2.实现Runnable接口
2-1---Thread(Runnable target)
分配一个新的Thread对象
Thread(Runnable target, String name)
分配一个新的Thread对象
2.2实现步骤
定义一个类MyRunnable实现Runnable接口
在MyRunnable类中重写run()方法
创建MyRunnable类的对象
创建Thread类的对象,把MyRunnable对象作为构造方法的参数
启动线程
2-3 多线程的实现方案有两种
继承Thread类
实现Runnable接口
2-3-1相比继承Thread类,实现Runnable接口的好处
避免了Java单继承的局限性
适合多个相同程序的代码去处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的设计思想
2.4同步代码块解决数据安全问题
安全问题出现的条件
是多线程环境
有共享数据
有多条语句操作共享数据
进程线程的概念 实现多线程的方式 设置和获取线程名称的方法 线程优先级 线程控制方法 线程的五种状态 同步方法和同步块 同步方法举例 锁 wait(),notify()含义
|
|