线程
进程(动态过程):运行中的程序,操作系统会为进程分配内存空间
线程:线程由进程创建,是进程的一个实体;一个进程可以拥有多个线程
单线程:同一个时刻,只允许执行一个线程
多线程:同一个时刻,可以执行多个线程
并发:同一时刻,多个任务交替执行(单核CPU执行的多任务)
并行:同一时刻,多个任务同时执行(多核CPU实现并行)
创建线程的两种方式
1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法
启动线程用start()方法,start()方法调用start0()方法,底层调用run方法才实现了多线程;而run方法只是一个普通方法;第二种方式:必须创建Thread对象,然后把继承了Runnable接口的对象放入Thread对象,在通过Thread对象启动线程;thread.start()
线程终止
1.当线程完成任务后,会自动退出
2.通过使用变量来控制run方法退出的方式终止线程(通知方式)
interrupt,中断线程,但没有真正的结束线程,所以一般用于中断正在休眠的线程
线程插队
1.yield:线程的礼让,让出CPU,让其他线程执行,但礼让的时间不确定,所以也不一定礼 让成功
2.join:线程的插队,插队的线程一旦插队成功,则肯定先执行完插入的线程的所有任务
用户线程(工作线程):当线程的任务执行完或通知方式结束
守护线程:一般是为各种线程服务的,当所有的用户线程结束,守护线程自动结束
常见的守护线程:垃圾回收机制
线程的生命周期
NEW:未启动的线程处于此状态
RUNNABLE:在java虚拟机执行的线程处于此状态
BLOCKED:被阻塞等待监听器锁定的线程处于此状态
WAITING:正在等待另一个线程执行特定动作的线程处于此状态
TIMED_WAITING:正在等待另一个线程执行特定动作到达指定时间的线程处于此状态
TERMINATED:已经退出的线程处于此状态
线程同步机制
在多线程编程,一些敏感的数据不允许多个线程同时访问,此时使用同步机制,保证数据在任何同一个时刻,最多有一个线程访问,以保证数据的完整性
Synchronized(互斥锁)
1.同步代码块
synchronized (对象){ //得到对象的锁才能操作同步代码块
//需要被同步的代码块
}
2.同步方法
public synchronized void m(String name){
//需要被同步的代码块
}
同步方法(非静态)的锁可以是this,也可以是其他对象(要求是同一个对象)
同步方法(静态)的锁为当前类本身
死锁:多线程相互占用对方资源,导致死锁
释放锁
1.当前线程的同步代码块、同步方法正常结束
2.当前线程在同步代码块、同步方法中遇到break、return
3.当前线程在同步代码块、同步方法中出现了未处理的error或Exception,导致异常结束
4.当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线程暂停,并且释放锁