5-线程池

2022-10-27 13:23:24 浏览数 (3)

线程池的概念

本质就是一个能够容纳多个线程的容器,其中的线程可以反复利用,省去了频繁创建线程对象的操作,无需因为反复创建线程对象而消耗过多资源

工作线程(PoolWorker)

表示线程池中的线程,在没有任务时处于等待状态,可以循环的执行任务

任务队列(TaskQueue)

用于存放没有处理的任务,提供一种缓冲机制

任务接口(Task)

每个任务必须实现的接口,一共工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等等

线程池管理器(ThreadPool)

用于创建并管理线程。包括:创建线程池,销毁线程池,添加线程或任务等等

线程池创建线程来执行,而Worker执行完之后,就去队列中取未分配的task,调用task的run方法。通俗的讲就是任务来后就分配一个线程使用,线程处于占用状态,如果任务执行完毕,线程归还于线程池,并且暂处于空闲状态

合理利用线程池的好处

降低资源消耗

减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可以执行多个任务

提高响应速度

不需要频繁的创建线程,如果有线程可以直接用,不会出现系统僵死

提高线程的可管理性

线程池可以约束系统最多只能由多少个线程,不会因为线程过多而死机

线程池的核心思想

线程复用,同一个线程可以重复多次被使用,来处理多个任务

代码语言:javascript复制
package ThreadPool;

/*
* 创建线程池
* 线程池在Java中的代表类:ExcutorService(接口)
* Java在Executors类下提供一个静态方法得到一个线程池的对象
* public static ExecutorService newFixedThreadPool(int nThreads);
* (创建一个可重用固定线程数的线程池并返回,以共享的无界队列方式来运行这些线程)
* */

import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolDemo {
    public static void main(String[] args) {
        //创建一个线程池,指定线程的固定数量是3
        ExecutorService pool= Executors.newFixedThreadPool(3);
        //添加线程任务给线程池处理
        Runnable task=new MyRunnable();
        //可以向线程池提交Runnable接口或Callable接口 ,Callable做线程池的任务可以得到线程执行的结果(返回值类型Future<?>)
        pool.submit(task);  //第一次向线程池提交任务,此时线程池创建新线程,自动触发执行,不需要再start()
        pool.submit(task);  //第二次向线程池提交任务,此时线程池创建新线程
        pool.submit(task);  //第三次向线程池提交任务,此时线程池创建新线程
        pool.submit(task);  //第四次向线程池提交任务,超出线程池固定数量,此时线程池复用之前的线程
        
        // pool.shutdown();  在等待任务执行完毕之后关闭线程池
        // pool.shutdownNow();  立即关闭线程池代码,无论任务是否执行完毕
        // 线程池开发中一般情况下不关闭
    }

}


class MyRunnable implements Runnable{

    @Override
    public void run() {
        for(int i=0;i<5;i  ){
            System.out.println(Thread.currentThread().getName() "==>" i);
        }
    }
}

0 人点赞