1.Java多线程技能
1.线程的启动
- 继承Thread
- 实现Runnable接口
2.如何使线程暂停
- suspend()与resume()
- yield()
3.如何使线程停止
- 使用退出标志使线程正常退出。
- 使用stop()方法强行终止线程
- 使用interrupt()方法中断线程
4.线程优先级
CPU优先执行优先级较高的线程对象中的任务,即让高优先级的线程获得更多的CPU时间片。
setPriority()
:设置优先级
特点:
- 线程优先级的继承特性
- 优先级的规律性
- 优先级的随机性
- 优先级对线程运行速度的影响
5.线程安全相关的问题
- 实例变量共享造成的非线性安全问题
- Servlet技术造成的非线性安全问题
- i–与System.out.println()出现的非线性安全问题、
2.对象及变量的并发访问
1.synchronized对象监视器为Object时的使用方法
是对指定的对象(方法,代码块等)起作用
2.synchronized对象监视器为Class时的使用方法
Class锁可以对类的所有对象实例起作用
3.非线性安全问题是如何出现的
- 实例变量的非线性安全问题
- 不同步导致的逻辑错误
- String常量池特性与同步相关的问题
- 同步synchronized方法无线等待问题
4.关键字volatile的主要作用
三大特性:可见性;原子性;禁止代码重排序;
5.关键字volatile与synchronized的区别及使用情况
- synchronized作用是保证同一时刻,只有一个线程可以执行某一个方法,或是某一个代码块。可以修饰方法及代码块。
- volition作用是让其他线程可以看到最新的值,只能修饰变量。
- 使用场景:
1)当想实现一个变量的值被更改时,让其他线程能取到最新的值时,就要对变量使用volatile.
2)当多个线程对同一个对象中的同一个实例变量进行操作时,为了避免出现非线程安全问题,就要使用synchronized.
3.线程间通信
1.如何使用wait/notify实现线程间的通信
wait()方法使当前线程暂停运行,notify()方法通知暂停的线程继续运行
2.生产者/消费者模式的实现
- 一生产与一消费:操作值
- 多生产与多消费:操作值(假死)
- 多生产与多消费:操作值(解决假死)
- 一生产与一消费:操作栈
- 一生产与多消费:操作栈(解决wait条件改变与假死)
- 多生产与一消费:操作栈
- 多生产与多消费:操作栈
- 允许连续生产多个:允许连续消费多个
3.join方法的使用
多线程创建并启动子线程,如果子线程要进行大量的耗时运算,主线程往往将早于子线程结束之前结束,这时如果主线程想等待子线程执行完成之后在结束,就是用join()方法。
- 方法join()的作用是等待线程对象销毁。
- x.join(long):不管线程是否执行完毕,时间到了并且重新获得了锁,则当前线程会继续向后运行。没有获得锁,一直尝试等待,直到获得锁为止。
- join(long millis,int nanos):等待该线程终止的时间最长为millis毫秒+nanos纳秒
4.ThreadLocal类的使用
类ThreadLocal的主要作用是将数据放入当前线程对象中的Map中,这个Map是Thread类的是变量。类ThreadLocal自己不管理,不存储任何数据,它只是数据和Map之间的桥梁,用于数据放入Map中,执行流程如下:
- 数据->ThreadLocal->currentThread()->Map.
- 设置值:t1.set(); 获取值:t1.get(); 初始化值:重写initialValue()方法
4.Lock对象的使用
1.ReentrantLock类的使用
- Object类中的wait()方法相当于Condition类中的await()方法。
- Object类中的wait(long timeout)方法相当于Condition类中的await(long time,TimeUnit unit)
- Object类中的notify()方法相当于Condition类中的signal()方法
- Object类中的notifyAll()方法相当于Condition类中的signalAll()方法。
2.ReentrantReadWriteLock类的使用
- 读读共享;写写互斥;读写互斥;写读互斥
- lock.readLock().lock()读锁;lock.writeLock().unlock()写锁
5.定时器Timer
1.如何实现按指定时间执行任务
schedule(TimerTask task,Date time)
:该方法的作用是在指定日起执行一次某一任务。schedule(TimerTask task,long delay)
:以方法当前的时间为参考时间,在此时间基础上延迟指定的毫秒数后执行一次TimerTask任务。
2.如何实现按指定周期执行任务
schedule(TimerTask task,Date time,long period)
:作用是在指定日期之后按指定的间隔周期无限循环地执行某一任务。schedule(TimerTask task,long delay,long period)
:以方法当前的时间为参考时间,再此时间基础上延迟指定的毫秒数再以某一间隔时间无限次数的执行某一任务。
6.单例模式与多线程
- 延迟加载/懒汉模式的解决多线程问题
1)声明synchronized关键字
2)尝试同步代码块
3)针对某些重要代码进行单独同步
4)使用DCL机制(双重校验锁)+ volition关键字 - 使用静态内置类实现单例模式
- 序列化与反序列化的单例模式 + 重写protected Object readResolve()方法
- 使用static代码块实现单例模式
- 使用enum枚举数据类型实现单例模式
7.其他
1.线程的状态
2.线程组的使用
线程组可以批量地管理线程或线程组对象,有效地对线程或线程组对象进行组织。
- 线程对象关联线程组:一级关联;多级关联;
- 线程组自动归属特性
3.SimpleDataFormat类与多线程的解决办法
- 创建多个SimpleDataFormat类地实例
- ThreadLocal结合SimpleDateFormat
4.如何对线程的异常进行处理
- 使用setUncaughtExceptionHandler()
- 使用setDefaultUncaughtExceptionHandler()