多线程-线程池

线程池概念和原理

我们使用线程的时候去创建一个线程,这样实现起来非常简便

但是出现了一个问题:如果并发的线程数量很多 并且每个线程都是执行一个时间很多的任务就结束了 这样频繁创建线程就会大大降低洗的效率 因为频繁创建线程和销毁线程需要时间 而线程池就可以解决这个问题

线程池:其实就是一个容纳多个线程的容器 其中的线程可以反复使用 省去了频繁创建线程对象的操作 无需反复创建线程而消耗过多资源

大白话线程池就是一个集合 如:LinkedList<Thread>

图解:

 线程池的好处:

1.降低资源消耗,减少了创建和销毁线程的次数 每个工作线程都可以利用被重复利用 可以执行多个任务

2.提高响应速度 当任务到达时 任务可以不需要的等到线程创建就能立即执行

3.提高线程的可管理性 可以根据系统的承受能力 调整线程池中工作线程的数目 防止因为消耗过高的内存 而把服务器累趴下(每个线程需要大约1MB内存 线程开的越多 消耗的内存也就越大 最后死机)

线程池代码实现

java.util.concurrent.Executors:线程池的工厂类 用来生产线程池

Executors类中的静态方法:

  • static ExecutorService newFixedThreadPool(int nThreads)创建一个可重用固定线程数的线程池

参数:int nThreads:创建线程池中包含的线程数量

返回值:ExecutorService接口,返回的是ExecutorService接口的实现类对象 我们可以使用ExecutorService接口接收

  • submit(Runnable task)提交一个Runnable任务用于执行
  • void shutdown()关闭/消耗线程池的方法

使用步骤:

1.使用线程池的工厂类Executors里边提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池

2.创建一个类 实现Runnable接口 重写run方法 设置线程任务

3.调用ExecutorService中的方法submit 传递线程任务(实现类) 开启线程 执行run方法

4.调用ExecutorService中的方法shutdown消耗线程池

代码:

public class DemoThreadPool {
public static void main(String[] args) {
//创建两个线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
pool.submit(new RunnableImp());
pool.submit(new RunnableImp());
pool.submit(new RunnableImp());
}
}
//创建Runnable实现类
class RunnableImp implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行线程");
}
}

运行结果:

 执行完之后它并没有停止 因为使用完线程就归还给了线程池 我们可以使用shutdown()销毁

代码:

public class DemoThreadPool {
public static void main(String[] args) {
//创建两个线程池
ExecutorService pool = Executors.newFixedThreadPool(2);
pool.submit(new RunnableImp());
pool.submit(new RunnableImp());
pool.submit(new RunnableImp());

pool.shutdown();
}
}
//创建Runnable实现类
class RunnableImp implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行线程");
}
}

运行结果:

 
posted @ 2022-10-17 10:27  想见玺1面  阅读(24)  评论(0编辑  收藏  举报