多线程:
进程: 就是正在执行的程序
多进程的意义: 是为了提高CPU的使用率
线程:
一个程序中存在多个任务,而每一个任务就是一个线程
多线程的意思: 提高程序的使用率
多线程在执行的时候都是在抢占CPU的时间片(CPU的执行权), 谁抢占到CPU的执行权,CPU就执行谁
JVM的运行原理:
我们使用java启动程序,其实是启动了JVM,这样就相当于启动了一个进程,而在这个进程中自动启动了一个线程
这个线程就是主线程,来通过这个线程调用main方法,执行main方法的方法体
JVM的启动是多线程的吗?
是.jvm在运行的时候至少启动了两个线程,一个是主线程,一个是垃圾回收线程
线程的调度和线程优先级
调度模型:
分时调度模型: 就是为每一个线程分配指定的时间
抢占式调度模型: 优先去执行优先级较高的线程
java语言采用的就是抢占式调度模型
线程的优先级:
如何来获取线程的优先级:
public final int getPriority() 返回线程的优先级。
如何给线程设置优先级:
public final void setPriority(int newPriority): 更改线程的优先级。
线程的优先级存在一个范围: 这个范围是1-10
如果我们没有给线程设置优先级那么使用的就是默认的优先级: 5
线程的控制
休眠 (掌握)
public static void sleep(long millis) throws InterruptedException
加入
public final void join() throws InterruptedException等待该线程终止。
注意事项:
必须是在启动之后,在调用该方法
礼让
public static void yield()暂停当前正在执行的线程对象,并执行其他线程。
守护
public final void setDaemon(boolean on)将该线程标记为守护线程或用户线程。
终止
public final void stop(): 终止线程
public void interrupt(): 中断线程。
stop和interrupt的区别:
stop: 表示的意思是终止该线程
interrupt: 将线程的阻塞状态中断
创建线程的两种方法:
第一种方式:
步骤:
a: 创建一个类然后让这个类继承Thread
b: 复写run方法
c: 创建a中的类的对象
d: 启动线程, 启动线程使用的是start方法
可以使用getName方法获取线程名称
可以使用setName方法设置线程名称
第二种方式:
步骤:
a: 创建一个类,然后让这个类实现Runnable接口
b: 复写run方法
c: 创建a中的类的对象
d: 创建Thread类的对象,把C中的对象作为参数传递进来
e: 启动线程
现获取当前正在执行的线程
Thread.currentThread()然后在调用getName方法获取
通过构造方法设置名称设置线程名称
卖票的案例
同步代码块:
synchronized(对象){
需要被同步的代码 ;
}
不同代码块保证同步的关键是在这个对象上.要求使用同一个对象. 这个对象看以看做成一个锁.
好处: 可以保证数据的安全性
弊端: 每一个线程都需要判断这个同步锁,所以效率比较低
同步代码块以及同步方法和静态同步方法的锁对象?
同步代码块: 锁是任意的对象
同步方法: 锁对象是this
静态同步方法: 该类对象的字节码文件对象
每一种数据类型都存在一个静态的class属性,可以用来获取当前类的字节码文件对象
|
|