线程池

阳光穿透心脏的1/2处 2022-04-01 05:23 304阅读 0赞

为什么
1、提高程序的执行效率;
如果程序中有大量短时间任务的线程,由于创建和销毁线程需要和底层操作系统交互,大量时间都耗费在创建和销毁线程上,因而比较浪费时间,系统效率很低;线程池里的每一个线程任务结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用,因而借助线程池可以提高程序的执行效率。
2、控制线程的数量,防止程序崩溃;
如果不加限制地创建和启动线程很容易造成程序崩溃,比如高并发1000W个线程,JVM就需要有保存1000W个线程的空间,这样极易出现内存溢出;线程池中线程数量是一定的,可以有效避免出现内存溢出。

  1. class CountThread implements Runnable{
  2. @Override
  3. public void run() {
  4. for (int i = 0; i < 5; i++) {
  5. }
  6. }
  7. }
  8. public class Test {
  9. public static void main(String[] args) {
  10. for(;;) {
  11. new Thread(new CountThread()).start();
  12. }
  13. }
  14. }

怎么做
在JDK5之前,必须手动才能实现线程池,从JDK5开始新增了一个Executors工厂类,通过该工厂类可以实现线程池,该类有如下常用方法:

  1. public static ExecutorService newCachedThreadPool()
  2. public static ExecutorService newFixedThreadPool(int nThreads)
  3. public static ExecutorService newSingleThreadExecutor()
  4. ExecutorService 表示一个线程池,该接口常用方法:
  5. Future<?> submit(Runnable task)
  6. <T> Future<T> submit(Runnable task, T result)
  7. void shutdown()
  8. 步骤:
  9. a、创建线程池对象;
  10. b、创建Runable接口实现类实例;
  11. c、交Runable接口实现类实例;
  12. d、关闭线程池
  13. import java.util.concurrent.ExecutorService;
  14. import java.util.concurrent.Executors;
  15. class CountThread implements Runnable{
  16. @Override
  17. public void run() {
  18. for (int i = 0; i < 10; i++) {
  19. System.out.println(Thread.currentThread().getName()+":"+i);
  20. }
  21. }
  22. }
  23. public class Test {
  24. public static void main(String[] args) {
  25. //创建线程池对象,该线程池中有两个闲置线程
  26. ExecutorService pool = Executors.newFixedThreadPool(2);
  27. //创建并提交Runable接口实现类实例
  28. pool.submit(new CountThread());
  29. pool.submit(new CountThread());
  30. //关闭线程池
  31. pool.shutdown();
  32. }
  33. }

发表评论

表情:
评论列表 (有 0 条评论,304人围观)

还没有评论,来说两句吧...

相关阅读