一:什么是线程?
线程:正在运行的程序 如QQ IDE
系统会为这个进程分配独立的内存资源
进程:执行任务的最小单位,一个进程最少拥有一个线程(运行起来就执行的线程称为主线程)
线程之间是共享内存资源的(进程申请的 线程之间可以通信的 如:数据传递)每一个线程都有自己的生命周期
二:如何创建一个线程?
创建线程:
NEW 新建 线程刚被创建好
RUNNABLE 就绪状态 只要有CPU的时间片就可以运行
BLOCKED 阻塞状态
WAITING 等待 wait
TIMED_WAITING 终止状态
TERMINATED 终止状态
实现线程的过程
1.自己描述一个类
2.继承一个父类Thread
3.重写run() 方法
4.new一个线程对象 调用start方法 让线程进入就绪状态
实例1:
创建一个类继承Thread
实现线程的第二种
1.自己描述一个类
2.实现一个父接口Runnable
3.重写run() 方法
4.new一个线程对象
实例2:
创建一个类实现Runnable接口
在实现的时候要麻烦一下
需要new 一个Thread 对象 在使用start() 方法
三:为什么要创建子线程 ?
1. 为了不阻塞主线程,将耗时的任务送给一个子线程,让子线程执行,让程序变得更快
线程中的一些方法:
join() 阻塞当前这个线程, 等join 的线程结束后再执行
setName () 设置线程的名称
getName() 获得线程名称
currentThread () 获得当前线程运行的对象
四:线程安全
1.使用synchronized 同步监听器 需要一把锁
synchronized ( 监听器/对象/锁 ){ 需要同步的代码 }
创建一个类管理票:在没有使用synchronized 关键字保护线程时会出现如下图线程安全1.0.1的情况
解决问题方法:
确保操作的对象是同一个 对象:synchronized ( 监听器/对象/锁 ){ 需要同步的代 码 } 如果多个线程操作一个代码块 必须操作同一个对象的同一把锁
执行效果如下:
2.使用Lock
Lock
static ReentrantLock lock = new ReentrantLock();
Lock中的一些方法:
lock.lock();
lock.unlock();
lock.newCondition();
ReentrantLock lock;
Condition c = lock.newCondition();