多线程
1.几个概念
程序:静态的代码
进程:操作系统调度和分配资源的最小单位
线程:程序内部的执行路径
线程调度策略
分时调度:所有线程'轮流使用'CPU的使用权,并且平均分配每个线程占用CPU的时间
抢占式调度:让‘优先级高’的线程以‘较大的概率’优先使用CPU,如果线程的优先级相同,那么随机选择一个(线程随机性),Java使用的是抢占式调度
>单核CPU与多核CPU >并行与并发
2.如何创建多线程
1:继承Thread类
2:实现Runnable接口
3:实现Callable接口
4:使用线程池
3.Thread类的常用方法、线程的生命周期
1.线程中的构造器 - public Thread():分配一个新的线程对象 - public Thread(String name):分配一个指定名字的1新的线程对象 - public Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接口中的run方法 - public Thread(Runnable target,String name):分配一个带有指定目标的新的线程对象并指定名字
2.线程中的常用方法 >start():启动线程,调用线程的run()方法 >run():将线程要执行的操作,声明再run中 >currentThread():获取当前执行代码对应的线程 >getName():获取线程名 >setName():设置线程名 >sleep():静态方法,调用时,可以使得当前线程睡眠指定的毫秒数 >yield():一旦执行此方法,就释放CPU的执行权 >join():线程a中通过线程b调用join(),意味线程a进入阻塞状态,直到线程b执行结束,线程a才结束阻塞状态,继续执行 >isAlive():判断当前线程是否还存在
过时方法 >stop():强行执行进入死掉 >void suspend()/void resume() 可能造成死锁 不建议使用
3.线程的优先级 getPriority():获取线程的优先级 setPriority():设置线程的优先级,范围【1,10】
Thread类内部声明的三个常量: -MAX_PRIORITY(10):最高优先级 -MIN_PRIORITY(1):最低优先级 -NORM_PRIORITY(5):普通优先级
线程的生命周期的State
jdk5.0及之后:Thread类
4.如何解决线程的安全问题
什么是线程的安全问题?多个线程操作共享数据,就有可能出去安全问题
如何解决?有几种方式?
同步机制:1.同步代码块 2.同步方法
重点关注:共享数据及操作共享数据的代码
注意:在实现Runnable接口的方式中,同步监视器可以考虑使用:this 在继承Thread类的方式中,同步监视器慎用this,可以考虑使用当前类.class
说明:
如果操作共享数据的代码完整的声明在了一个方法中,那么我们就可以将此方法声明为同步方法即可 非静态的同步方法,默认同步监视器是this 静态的同步方法,默认同步监视器是当前类的本身
jdk5.0新增:Lock接口及其实现类
5.同步机制相关的问题
懒汉式的线程安全的写法
同步机制带来的问题:死锁
6.线程间的通信
同步机制下,考虑线程间的通信
wait(),notify(),notifyAll()都需要使用在同步代码块或同步方法中