线程池介绍及创建线程池的4种方式是什么_程序可以创建几个线程池

线程池介绍及创建线程池的4种方式是什么_程序可以创建几个线程池1.什么是线程池Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1. 什么是线程池

Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序
都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。
第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,
还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。但是,要做到合理利用
线程池,必须对其实现原理了如指掌。

2.线程池作用

线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜。),况且我们还不能控制线程池中线程的开始、挂起、和中止。

3.线程池四种创建方式

Java通过Executors(jdk1.5并发包)提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

4.案例演示:

newCachedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

package com.company.emple4;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/** * @author shkstart * @date 2019/6/10- 16:16 */
public class Test001 { 
   
    public static void main(String[] args) { 
   
        //1.创建可缓存的线程池,可重复利用
        ExecutorService newExecutorService = Executors.newCachedThreadPool();
        //创建了10个线程
        for (int i = 0; i < 10; i++) { 
   
            int temp = i;
            newExecutorService.execute(new Runnable() { 
   
                @Override
                public void run() { 
   
                    System.out.println("threadName;"+Thread.currentThread().getName()+",i"+temp);
                }
            });
        }

    }
}

在这里插入图片描述
可以看到本来创建了10个线程池,这里只用了7个,因为newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程

newFixedThreadPool

创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

package com.company.emple4;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/** * @author shkstart * @date 2019/6/10- 16:16 */
public class Test001 { 
   
    public static void main(String[] args) { 
   
        //1.创建可固定长度的线程池
        ExecutorService newExecutorService = Executors.newFixedThreadPool(3);
        //创建了10个线程
        for (int i = 0; i < 10; i++) { 
   
            int temp = i;
            newExecutorService.execute(new Runnable() { 
   
                @Override
                public void run() { 
   
                    System.out.println("threadName;"+Thread.currentThread().getName()+",i"+temp);
                }
            });
        }

    }
}

在这里插入图片描述
可以看到newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

newScheduledThreadPool

创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

package com.company.emple4;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import static java.util.concurrent.TimeUnit.*;

/** * @author shkstart * @date 2019/6/10- 16:16 */
public class Test001 { 
   
    public static void main(String[] args) { 
   
        //1.创建可定时线程池
        ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(5);
        for (int i = 0; i < 10; i++) { 
   
            final int temp = i;
            newScheduledThreadPool.schedule(new Runnable() { 
   
                public void run() { 
   
                    System.out.println("i:" + temp);
                }
            }, 3, TimeUnit.SECONDS);
        }

    }
}

在这里插入图片描述
表示延迟3秒执行。

newSingleThreadExecutor

创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:

package com.company.emple4;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import static java.util.concurrent.TimeUnit.*;

/** * @author shkstart * @date 2019/6/10- 16:16 */
public class Test001 { 
   
    public static void main(String[] args) { 
   
        //1.创建单线程
        ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) { 
   
            final int index = i;
            newSingleThreadExecutor.execute(new Runnable() { 
   

                @Override
                public void run() { 
   
                    System.out.println("index:" + index);
                    try { 
   
                        Thread.sleep(200);
                    } catch (Exception e) { 
   
                        // TODO: handle exception
                    }
                }
            });
        }
        newSingleThreadExecutor.shutdown();
    }
}

在这里插入图片描述
注意: 结果依次输出,相当于顺序执行各个任务。当shutdown时停止线程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187023.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月1日 下午6:46
下一篇 2022年10月1日 下午6:46


相关推荐

  • shell if 小数 比较

    shell if 小数 比较shell的[]对于数值的判断都是基于整数的,如果碰到小数就无能为力了。google了一把发现用awk的牛人多,不过发现一个兄弟的更加好。if[`expr$a\>$b`-eq0];thenecho$bisbiggerelseecho$aisbiggerfi通过ex…

    2022年7月27日
    25
  • PL/SQL语句_sql语句declare用法

    PL/SQL语句_sql语句declare用法因为SQL只能访问、操作数据库,却不能进行程序设计,而OraclePL/SQL是一种高级数据库程序设计语言,该语言专门用于对ORACLE数据库进行访问,并且可以进行过程处理。*注:在PL/SQL中只能用SQL语句中的DML部分,不能用DDL部分,如果要在PL/SQL中使用DDL(如CREATEtable等)的话,只能以动态的方式来使用。**1.DML(datamanipulationlanguage)数据操纵语言:比如SELECT、UPDATE、INSERT、DELETE

    2022年8月20日
    9
  • Go语言爱好者周刊:第 3 期

    Go语言爱好者周刊:第 3 期这里记录每周值得分享的Go语言相关内容,周日发布。欢迎投稿,推荐或自荐文章/软件/资源等,请提交issue[1]。鉴于大部分人可能没法坚持把英文文章看完,因此,周…

    2022年5月20日
    41
  • sql文件导入数据库变乱码_sql查询的汉字乱码是怎么办

    sql文件导入数据库变乱码_sql查询的汉字乱码是怎么办首先建立同名空数据库1.用记事本(或UE)打开刚才的导出的SQL文件;2.另存此文件——打开另存为对话框,选择对话框中的编码格式为UNICODE编码;3.保存文件,然后CTRL+A,全选;4.复制里面的SQL语句到SQLyog中的“SQL编码器”当中,再执行一次SQL语句;5.执行完成后切记刷新一次,查看中文的数据表,乱码消除,大功告成;…

    2026年4月17日
    6
  • mysql的innodb与myisam(oracle主键和唯一索引的区别)

    InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了1、事务和外键InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索…

    2022年4月14日
    76
  • js嵌套for循环执行顺序

    js嵌套for循环执行顺序外层循环判断条件 满足进入外层循环体内层循环判断条件 满足进入内层循环体内层判断条件满足 循环变量累加直至不满足判断条件退出至外层循环体以下为 js 遍历 script vari j for i 1 i lt 9 i document write br for j 1 j amp br script

    2026年3月16日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号