[笔记] 线程和线程池
线程
一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
进程:一个进程包括操作系统同分配的内存空间,包含一个或多个线程,一个线程不能独立的存在,它必须是进程的一部分。
一个进程一直运行,直到所有的非守护线程都结束才能结束。
线程的生命周期:

- new - 新建状态
使用 new 关键字和 Thread 类或其子类简历一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。 - runnable - 就绪状态
调用 start() 方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。 - running - 运行状态
就绪状态的线程获取CPU资源,就可以执行run(),此时线程专题太处于运行状态。可转变为阻塞状态、就绪状态、死亡状态。 - blocked - 阻塞状态
如果执行了 sleep() 、suspend(挂起) 等方法,失去所占用资源之后,从运行状态进入阻塞状态。- 等待阻塞:运行状态中执行 wait() 方法
- 同步阻塞:获取 synchronized 同步锁失败
- 其他阻塞:调用 sleep() , join() 发出了I/O请求时会进入阻塞状态。当 sleep() 状态超市,join() 等待线程终止或超时,或者I/O处理完毕,重新进入就绪状态。
- dead - 死亡状态
完成任务或者其他终止条件触发
优先级
取值 1-10
默认 5
创建线程
1. 通过实现 Runnable 接口来创建线程
2. 通过继承Thread来创建线程
3. 通过 Callable 和 Future 创建线程
Runnable 和 Callable 对比:
-
实现 Callable接口 的任务线程能返回执行结果
-
实现 Runnable接口 的任务线程不能返回结果
-
Callable接口 的 call() 方法允许抛出异常
-
Runnable接口 的 run() 方法的异常只能在内部消化,不能继续上抛
Callable接口 需要调用 FutureTask.get() 方法实现返回执行结果
线程池
容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。
用处
线程池主要用来解决线程生命周期开销问题和资源不足问题。
通过对多个任务重复使用线程,线程创建的开销就被分摊到了多个任务上了,而且由于在请求到达时线程已经存在,所以消除了线程创建所带来的延迟。
线程池车创建
通过线程池工厂创建,再调用线程池中的方法获取线程,再通过线程去执行任务方法
- Executors 线程池创建工厂类
// 创建线程池对象
ExecutorService service = Executors.newFixedThreadPool(线程的数量);
---code---
---code---
// 关闭线程池
service.shutdown()
使用Runnable接口创建线程池
service.submit(new Runnable(){
public void run(){
巴拉巴拉巴拉;
}});
使用Callable接口创建线程池
service.submit(new Callable(){
public Object call() throws Exception{
巴拉巴拉巴拉;
return null;
}});

浙公网安备 33010602011771号