[笔记] 线程和线程池

线程

一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

进程:一个进程包括操作系统同分配的内存空间,包含一个或多个线程,一个线程不能独立的存在,它必须是进程的一部分。

一个进程一直运行,直到所有的非守护线程都结束才能结束。

线程的生命周期:

  • 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;
}});
posted @ 2019-12-20 10:58  带了1个小才艺  阅读(105)  评论(2)    收藏  举报