JAVA多线程学习笔记整理
多线程:
- 三种创建方法
- 继承Thread类,以线程运行内容重写run方法,创建Thread对象并用start方法启动该线程。
(匿名内部类)
(Lambda表达式)
- 实现Runable接口,以线程运行内容实现run方法,创建Thread对象并输入Runable实现对象,以start方法启动该线程。
- (不常用)实现Callable接口,传入一个泛型T,其类型与其返回值相同,实现其call方法,创建FutureTask任务对象并传入创建好的Callable对象,最后创建Thread对象并输入FutureTask任务对象,以start方法启动线程
- 所有线程不可外部强制停止,应定义相关变量提示其他线程让其自行释放资源并关闭。
- 用户线程和守护线程
- 用户线程指通常我们创建的普通线程,进程会等待所有用户线程执行完毕停止。
- 守护线程(deamon)指伴随用户线程一同运行的线程,当用户线程全部结束时,守护线程会即时停止。
- 线程锁
- 同步代码块(非公平):以任意一个对象为锁,通过synchronized(锁){//要锁的内容}来实现一段代码的同步化,指有且仅有一个线程能同时运行此处代码。
- 同步方法(非公平):在定义方法时,通过在其定义返回值前添加synchronized来为此方法上锁:public synchronized void functionOne(){//要锁的内容}
- Lock对象(可公平):定义一个锁对象,通过调用其方法来上锁(.lock())和解锁(.unlock()),可通过构造时传入true来设定公平锁(默认为非公平锁),又称为显式锁。、
- 线程阻塞问题:多个线程等在同一把锁前。
- 线程死锁问题:尽量避免同时触发两个锁。
- 线程沟通问题:定义互通变量传递信息。
- 线程池:多个线程的集合
- 缓存线程池(ExcutorService es = Excutors.newCachedThreadPool()):长度无限制,如线程池中无空闲线程则创建线程放入线程池,然后使用。
- 定长线程池(ExcutorService es = Excutors.newFixedThreadPool()):规定长度,如线程池中无空闲线程则等待线程池出现空闲线程,然后使用。
- 单线程线程池(ExcutorService es = Excutors.newSingleThreadPool()):单线程线程池,池中只有一个线程,不空闲则等待其空闲,然后使用。
- 周期定长线程池(ScheduledExecutorService ses =Excutors.newScheduledThreadPool()):规定长度,如池中无空闲线程,且池中线程不超长度,创建线程并放入线程池并使用。若超过长度,则等待出现空闲线程,然后使用。可指定一定时间后以一个时间间隔反复运行一个任务。
- NEW:尚未启动的线程
- RUNNABLE:正在JVM中执行的线程
- BLOCKED:被阻塞的线程
- WAITING:无限期等待另一个线程执行特定操作的线程
- TIMED_WAITING:有限期等待另一个线程执行操作的线程
- TERMINATED:完成任务并关闭的线程
线程的六种状态Thread.State:
以上内容大部分可在JAVA api 中查阅。此文档只用作个人的学习笔记整理。
赞 (0)