多线程-线程池
线程池概念和原理
我们使用线程的时候去创建一个线程,这样实现起来非常简便
但是出现了一个问题:如果并发的线程数量很多 并且每个线程都是执行一个时间很多的任务就结束了 这样频繁创建线程就会大大降低洗的效率 因为频繁创建线程和销毁线程需要时间 而线程池就可以解决这个问题
线程池:其实就是一个容纳多个线程的容器 其中的线程可以反复使用 省去了频繁创建线程对象的操作 无需反复创建线程而消耗过多资源
大白话线程池就是一个集合 如: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()+"执行线程");
}
}
运行结果: