使用线程的时候就创建一个线程,会出现问题: 如果并发的线程数量很多,而且每个线程都只执行了一个时间很短的任务,这么频繁的创建线程就会大大降低系统的效率,会耗费很多时间创建和销毁线程。
线程池的思想就是为了解决这个问题,使线程可以复用,就是执行完一个任务不销毁而是继续执行其他任务。
线程池(容器)–》集合
在jdk 1.5之后内置了线程池,可以直接使用
合理使用好处:
降低资源消耗。提高响应速度,不需要等到线程创建。提高线程管理。主类test
package project; /* * JAVA内置线程池的工厂类 用来生成线程池 * java.util.concurrent.Executor; * 生成线程池的静态方法 * static ExecutorService newFixedThreadPool(int nThreads)创建一个可重用线程数的线程池 * 参数: * int nThreads:创建线程池中线程的数量 * 返回值: * ExecutorService 返回的是ExecutorService接口的实现类对象,我们可以使用ExecutorService接口接收(面向接口编程) * * 用来从线程池中获取线程,调用start方法执行线程任务 * submit(Runnable task)提交一个Runnable任务用于执行 * 关闭/撤销线程池 * void shutdown() * * 线程池使用步骤: * 1.使用工厂类Executors里提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池 * 2.创建一个类 实现Runnable接口 重新run方法 设置线程任务 * 3.调用Executors中的方法submit 传递线程任务(实现类) 开启线程 执行run方法 * 4.调用Executors中的方法shutdown销毁线程池(不建议执行) */ import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class test{ public static void main(String[] args) { //1.使用工厂类Executors里提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池 ExecutorService esExecutors=Executors.newFixedThreadPool(2); //3.调用Executors中的方法submit 传递线程任务(实现类) 开启线程 执行run方法 esExecutors.submit(new test01());//pool-1-thread-2创建了一个新的线程 //线程池会一直开启,使用完了线程会自动归还给线程池,线程池就可以继续使用 esExecutors.submit(new test01());//pool-1-thread-1创建了一个新的线程 esExecutors.submit(new test01());//pool-1-thread-2创建了一个新的线程 //4.调用Executors中的方法shutdown销毁线程池(不建议执行) esExecutors.shutdown(); //上一步关闭了线程池,所以在调用线程就会报错 esExecutors.submit(new test01()); } }实现类test01
package project; import com.sun.org.apache.xalan.internal.xsltc.compiler.sym; public class test01 implements Runnable{ @Override public void run() { // 2.创建一个类 实现Runnable接口 重新run方法 设置线程任务 System.out.println(Thread.currentThread().getName()+"创建了一个新的线程"); } }三个进程运行结果:
在调用三个进程之后关闭线程池再调用:
