原理:
线程池本质就是一个集合(ArrayList,LinkedList<Thread>,HashSet,HashMap),当程序第一次启动时,启动多个线程保存到一个集合中,想要使用线程时从集合中取出来集合,所以一般使用LinkedList集合,当时用完一个线程时需归还到线程池,在JDK1.5之后,java内置了线程池,无需自己创建集合。
合理使用户线程池的好处:
1.降低资源损耗,减少了创建和销毁线程的次数,每个工作线程可以多次使用,可执行多个任务。
2.提高响应速度,当任务到达时,任务可以不需要等待线程创建就能立即执行
3.提高线程的可管理性,可根据内存承受能力调整线程池中的线程数目。
如果创建并发执行的多个线程,用普通的创建方法效率是非常低的,使用线程池就可以高效的创建使用多个线程。
线程池的使用步骤:
1.使用线程池的工厂类Executors里面提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池
2.创建一个类,实现Runnable方法,重写run方法,设置线程任务
3.调用ExecutorsService中的sumbit方法,传递线程任务(实现类),开启线程执行run方法
4.调用ExecutorsService中的shutdown方法销毁线程池
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// 2.创建一个类,实现Runnable方法,重写run方法,设置线程任务
public class Runnableimpl implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"正在执行");
}
public static void main(String[] args) {
// 1.使用线程池的工厂类Executors里面提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池
ExecutorService es = Executors.newFixedThreadPool(2);
// 3.调用ExecutorsService中的sumbit方法,传递线程任务(实现类),开启线程执行run方法
es.submit(new Runnableimpl());
es.submit(new Runnableimpl());
es.submit(new Runnableimpl());
es.shutdown();//调用shutdown方法后在线程池已被销毁再调用submit方法则会抛异常
es.submit(new Runnableimpl());
}
}
/*
<--------------------------------执行结果-------------------------------------->
pool-1-thread-2正在执行
pool-1-thread-1正在执行
pool-1-thread-2正在执行
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@14ae5a5 rejected from java.util.concurrent.ThreadPoolExecutor@7f31245a[Shutting down, pool size = 2, active threads = 1, queued tasks = 0, completed tasks = 2]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
at com.Runnableimpl.main(Runnableimpl.java:24)
*/