关于多线程的理解
进程与线程
- 进程 :是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元;
- 线程:就是进程中的一个独立控制单元,线程在控制着进程的执行。一个进程中至少有一个进程。
- 多线程:一个进程中不只有一个线程。
线程的属性、状态、生命周期
多线程的就绪、运行和死亡状态
- 就绪状态转换为运行状态:当此线程得到处理器资源;
- 运行状态转换为就绪状态:当此线程主动调用yield()方法或在运行过程中失去处理器资源。
- 运行状态转换为死亡状态:当此线程线程执行体执行完毕或发生了异常。
Java线程具有五中基本状态
- 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();
- 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;
- 运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
- 阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。
- 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
多线程的优点
- 多线程从某方面可以等价于多任务,当你有多个任务要处理时,多个任务一起做所消耗的时间肯定比任务串行起来做,所消耗的时间短;
- 在我们现在的系统中,CPU的运行速度是很快的,其中很大的时间消耗是在等硬盘、IO输入、网络等资源;当多任务时,CPU完全可以在多个任务之间来回切换。使用的花费的时间远远少于所有任务需要消耗的少;
- 进程之间不能共享数据,线程可以;
- 系统创建进程需要为该进程重新分配系统资源,创建线程代价比较小。
多线程带来的问题
- 线程的生命周期开销非常高
- 消耗过多的CPU资源
- 降低稳定性
创建线程的方法
- 继承Thread类:
- 定义类继承Thread;
- 复写Thread类中的run方法;
- 调用线程的start方法:
- 实现Runnable接口
- 通过Callable和Future创建线程
线程池的优点
- 降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;
- 提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;
- 方便线程并发数的管控;
- 提供更强大的功能,延时定时线程池。
关于ThreadLocal
- threadlocal而是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据
- threadLocal提供了线程内存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。
网友评论