多线程
多线程:
并发与并行
并行:两个或者两个以上的事件 同一时刻发生
并发:两个或者两个以上的事件 同一个时间段内发生
线程与进程
进程:一个内存中运行的应用程序
线程 :进程中一个执行单元,复制当前进程中程序的执行,一个进程中至少有一个线程, 一个进程是可以有多个线程的,这个程序可以称为多线程程序
线程调度 : jvm采用是抢式调度 没有分时调度
主线程
1.main()方法即为主线程入口
2.产生其他子线程的线程
3.必须最后完成执行,因为它执行各种关闭工作
Thread类:
java.lang.Thread类支持多线程编程
常用方法:
void run() 执行任务的操作
void satrt() 开启线程
void sleep(long millis) 暂停执行,millis休眠时长,毫秒为单位
String getName() 返回线程名称
int getPriority() 返回线程优先级
void setPriority(int newPriority) 更改线程优先级
Thread.State getState() 返回线程状态
boolean isAlive() 测试线程是否处于活动状态
void join() 等待该线程终止
void interrupt() 中断线程
void yield() 暂停当前执行的线程对象 执行其他线程
继承Thread类创建线程:
1.定义一个自定义类继承Thread类
2.重写run()方法,编写线程执行体
3.创建自定义线程对象,调用start()方法启动线程
缺点:
java只支持单根继承,当一个类继承了Thread类就不能继承其他类了,不方便扩展其他的功能(推荐使用实现Runnable接口方式创建线程)
创建线程对象:
创建继承Thread类的对象
实现Runnable接口创建线程:
1.定义一个自定义类实现Runnable接口
2.实现run()方法,编写线程执行体
3.创建实现Runnable接口实现类的对象
4.创建线程对象(Thread对象),将实现Runnable接口的对象作为参数传入线程对象(Thread对象)
5.调用Thread对象的start()方法启动线程
创建线程对象:
先创建Runnable接口实现类的对象
再将这个对象作为参数传入线程对象(1.创建自定义类的对象2.使用创建的对象创建Thread对象)
线程对象调用start()方法和调用run()方法的区别:
run():只有主线程一条执行路径
start():多条执行路径,主线程和子线程并行交替执行
线程安全:
如果有多个线程同时运行 而这些线程同时运行这段代码,如果程序运行的结果和单线程结果一样 而且运行的结果和预期也是一样的 就是线程安全
线程同步:
当我们使用多个线程访问同一个资源 ,并且多个线程中对资源有写的操作 就容易出现线程安全问题 解决 java中提供同步来解决 synchronized
使用同步代码块解决多线程安全
* 格式
* synchronized(锁对象){
* 出现安全问题代码
* }
* 1 锁对象 任意对象
* 2 必须保证多个线程使用的是同一个锁对象
* 3 把{} 只让一个线程进
使用同步方法解决多线程安全
* 使用步骤
* 1 创建一个方法 修饰符添加synchronized
* 2 把访问了 共享数据的代码放入到方法中
* 3 调用同步方法
使用Lock接口解决多线程安全
* lock();
* unlock()
* 使用步骤
* 1 在成员的位置 创建Lock接口的实现类 ReentrantLock
* 2 在可能会出现代码的问题前面 调用lock()方法
* 3 在可能会出现代码的问题后面 调用unlock() 释放锁对象
线程状态:
当线程被创建后 不是一一启动就进入执行状态
- NEW 线程刚被创建 但是未被启动
- Runnable 可运行 jvm里的状态
- Blocked 阻塞
- Waiting 无限等待 一个线程在等待另外一个线程唤醒
- TimedWaiting 计时等待
- Teminated 被终止 因为run() 正常退出而死亡