--------------------------------------------多线程
并发:指两个或多个时间在同一个时间段内发生(交替执行)
并行:指两个或多个时间在同一个时刻发生(同时发生)
进程:是指一个正在内存中运行的应用程序,每个程序都有一个独立的内存空间,一个应用程序可以同时运行多个进程
进入到内存的程序叫进程
线程:是进程中的一个执行单元,负责当前进程中的程序执行,一个进程中至少有一个线程
多线程的实现方式有两种:
1.继承Thread类
重写run()方法
优点:使用方法简单
2.实现Runnable接口
实现run()方法
优点:代码分离 耦合度低
Thread(Runnable target) 分配一个新的Thread对象
Thread(Runnable target, String name) 分配一个新的Thread对象
线程的两种调度方式
分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些
常用方法:
start()开始程序
get
1.通过set/get方法设置线程的名称
2.通过有参构造设置
线程优先级:
setPriority()
getPriority()
线程控制:
sleep();使当前正在执行的线程停留(暂停执行)指定的毫秒数
join();等待这个线程死亡,后面的才执行
setDaemon(boolean on);将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
线程的生命周期
阻塞
/ \
创建-----就绪-----运行-----结束
---------------------------------------------------------------------线程同步
为什么会出现安全问题
1.是多线程环境
2.有共享数据
3.有多条语句操作共享数据
打破其中一条就可以创造让程序没有安全问题的环境
同步代码块:
格式:
synchronized(任意对象) {
多条语句操作共享数据的代码
}
好处:解决了多线程的数据安全问题
弊端:当线程很多时,因为每个线程都会去判断同步上的锁,很耗费资源,降低运行效率
同步方法:
同步方法的所对象是this
格式:
public synchronized void 方法名() {
方法体
}
静态同步方法:
静态同步方法的锁对象是本类的class属性
格式:
public static synchronized void 方法名() {
方法体
}
线程安全的类:
Lock类
lock是个接口
Lock lock = new ReentrantLock()
一般搭配try...finally使用
void lock() 获得锁
void unlock() 释放锁
生产者和消费者模式
void wait() 导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法
void wait(long m) 相当于sleep方法,传入一个毫秒值,如果在毫秒值结束之后还没有被唤醒,则自动醒来
void notify() 唤醒正在等待对象监视器的单个线程,如果有多个线程,随机唤醒一个
void notifyAll() 唤醒正在等待对象监视器的所有线程
|
|