1. 线程为何诞生?
操作系统控制并发以及资源分配是以进程为基本单位,这很棒,但是每次资源的分配和回收是个比较费时间的问题,为了减少资源分配回收在高频度调用的情况下浪费的时间,并同时保持较高的并发性,所以出现了
线程
一个比进程更加轻量级的调度单位! (听说go语言还有比线程更小的好像叫管程
…);
2. java 中对线程的定义以及使用!
2.1 定义
java 中对线程的抽象具体表现是 Thread 类!
>可以看到 Thread 是实现了Runable 接口的! 那Runable 接口时干啥的?
根据源码的注释翻译可以发现,Runable 接口定义的是,当有类实现这个接口,并创建线程时,
会单独用一个线程来执行这个对象的run方法!
2.2 使用
- 线程想要使用,就要先创建,创建有两种方式
- 写一个自己的线程类继承Thread类,重写这个Thread类的run() 方法!
- 写一个类实现Runable接口,实现run() 方法,并创建一个Thead类将实现Runable接口的类的对象传递作为构造参数!
- 当然,我们可以发现这些run() 方法返回值都是 void 如果我们想要获得线程执行结束后的结果怎么办? 这个就涉及到线程之间的通信了!(后面的博客会讲这里做个铺垫…)
* 线程的使用就很简单了,用Thread类的实例调用start() 方法即可!(我认为,这个start() 方法就是,创建线程,并将run() 中的代码放入线程的代码段,让后将线程放入执行队列中!))
start() 是一个线程安全的方法!
调用其他语言的方法(其实是调用操作系统实现的接口),实现线程创建!
有兴趣的盆友可以,去看源码的具体实现!
3. 线程一系列
3.1 线程的常见属性
3.2 线程的常见方法
3.3 线程的状态
- NEW: 安排了工作, 还未开始行动
- RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.
- BLOCKED: 这几个都表示排队等着其他事情
- WAITING: 这几个都表示排队等着其他事情
- TIMED_WAITING: 这几个都表示排队等着其他事情
- TERMINATED: 工作完成了
状态转移图:
状态的形象理解
4. 线程安全问题
4.1 问题存在的原因