1多线程概述
1.1什么是多线程
1.线程属于进程,一个进程可以多个线程
2.线程是进程中的一个独立执行单元
3.线程创建开销相对于进程来说更小
4.线程具有并发性
1.2基础知识点:
main方法是一个主线程来看待
获取当前线程API
currentThread()
静态方法不能存在this关键字
线程同步与性能的关系
锁的越细性能越好;线程同步方式极大的影响了性能
因此能不上锁不上锁;
多线程 的代码由于cpu的调度方式不同,最终呈现的结果是代码随机性跑完,每次运行的结果不同;
线程常用的API
setName,getName,currentThread
2多线程三种创建方式
2.1直接继承式
写一个类继承Thread
重写run()
主接口中main,直接创建对象,start()即可;
2.2实现Runnable接口
创建一个类继承Runnable接口
重写run()
创建一个线程任务对象
将线程任务对象包装成线程对象
直接start()
2.3使用Callable接口
前两种实现方法的缺点:无法获取线程的执行结果
实现Callable接口
重写run()
创建Callalble对象
将Callable对象包装成未来任务对象
将未来任务对象包装成线程对象
start()
3线程同步方式
同步方式分为三种:同步代码块,同步方法,lock锁
为什么要进行同步:并发程序中多个线程抢占资源可能会出现安全问题;具体来说cpu调度过程中线程a run()的时候,还没有将资源变量进行更新;b 就开始获取资源变量
3.1同步代码块
格式
synchronized(obj){
//需要上锁的代码块
}
synchronized就是同步的意思,同步代码块就是将一些代码块进行捆绑执行;防止资源抢占出现安全问题;
注:obj是 可以任意的且唯一存在 的锁对象
静态方法中 类名.class
实例方法中 this.class
3.2同步方法
直接将方法中加入synchronized关键字
关于锁对象;与同步代码块介绍的一致;、
3.3lock显示锁
java.util.concurrent.locks.Lock
一般写法:
1.创建个lock对象
private final Lock lock = new RenentrantLock();
2.直接加锁解锁
lock.lock();
lock.unlock();
上述写法的问题:
10000行代码出现异常,直接抛,但是解锁没有执行;因此线程直接锁死
正确的写法
try{
lock()
}Exception e{
}finally{
unlock()
}
意义:不论是否抛出异常,unlock都可以执行;