首页 > 其他分享 >ExecutorService 的理解和使用

ExecutorService 的理解和使用

时间:2023-06-05 17:35:22浏览次数:56  
标签:index 执行 Thread Executors 理解 线程 使用 new ExecutorService

前言:

我们之前使用线程的时候都是使用new Thread来进行线程的创建,但是这样会有一些问题。如:

a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。

而我们今天来学习和掌握另外一个新的技能,特别像一个线程池的一个接口类ExecutorService,下面我们来了解下java中Executors的线程池

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

(1). newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:

复制代码 复制代码
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
    final int index = i;
    try {
        Thread.sleep(index * 1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    cachedThreadPool.execute(new Runnable() {

        @Override
        public void run() {
            System.out.println(index);
        }
    });
}
复制代码 复制代码

线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
 
(2). newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:

复制代码 复制代码
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
for (int i = 0; i < 10; i++) {
    final int index = i;
    fixedThreadPool.execute(new Runnable() {


        @Override
        public void run() {
            try {
                System.out.println(index);
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
}
复制代码 复制代码

因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。可参考PreloadDataCache。
 
(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:

复制代码 复制代码
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
scheduledThreadPool.schedule(new Runnable() {

    @Override
    public void run() {
        System.out.println("delay 3 seconds");
    }
}, 3, TimeUnit.SECONDS);
复制代码 复制代码

表示延迟3秒执行。
 
定期执行示例代码如下:

复制代码 复制代码

scheduledThreadPool.scheduleAtFixedRate(new Runnable() {

@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);

复制代码 复制代码

表示延迟1秒后每3秒执行一次。
ScheduledExecutorService比Timer更安全,功能更强大,后面会有一篇单独进行对比。
 
(4)、newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:

复制代码 复制代码
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
    final int index = i;
    singleThreadExecutor.execute(new Runnable() {

        @Override
        public void run() {
            try {
                System.out.println(index);
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    });
}

标签:index,执行,Thread,Executors,理解,线程,使用,new,ExecutorService
From: https://www.cnblogs.com/xiaofengfree/p/17458499.html

相关文章

  • ChartGPT 到期后是否还能使用?
    今天在浏览器中搜索时发现,ChartGPT插件出现异常,无法返回预期值,出现报错信息。如图示:然后到官网查看使用情况,发现已经过期。然后到网页端发现还能正常使用。总结:网页端可以正常使用,但是嵌入API-KEY的插件不能使用了,如想继续使用只能到网页端使用。由于现在不能注册新账号......
  • linux 上使用的命令
    常用的命令mkdir文件夹名(创建文件夹)touch文件名 (创建文件)mv 文件要目标地址 (移动文件)解压命令:tar-zxvf/bbs.tar.zip-C/zzz/bbs将文件解压到指定文件夹下tar-xvffilename.tartar-zxvffilename.tar.gztar-zxvffilename.tgz......
  • springboot中使用cache和redis
    知识点:springboot中使用cache和redis (1)springboot中,整合了cache,我们只需要,在入口类上加 @EnableCaching 即可开启缓存 例如:在service层使用@Cacheable和CacheEvict //添加缓存@Cacheable(cacheNames="TestCACHE",key="#root.methodName+'_'+#id")publicMap<String,......
  • Semaphore 的使用
    varworkerSemphore=newSemaphore(0,800000);varIsWorkThreadCreated=true;varworkThread=newThread(()=>{Console.WriteLine("XiaoweiSDK.CreateWorkerThreadcreated!");......
  • 记录一下这次关于死循环使用愚蠢的行为
    在一个多线程的使用场景下,有个变量标记线程是否退出,然后我有这么一行代码while(!stopRequest){}这个问题是cpu某个核会一直占用,正确做法是在loop中sleep一段时间,例如1毫秒,10毫秒,100毫秒。让Cpu资源释放出去,sleep的时间越短,cpu资源就越紧张......
  • 使用类型标注
    有时PyCharm无法判断变量类型,此时PyCharm自动补全功能失效。使用类型标注来告诉PyCharm变量类型,从而使PyCharm提供自动补全。型标注的格式:变量名:类型=值age:int=24#定义一个变量age,它的类型为int,值为24deftest(name:str,age:int=25,other_info:dict=None):......
  • 使用powermock写springboot2.7业务类的测试用例
    1,引入powermock依赖<dependency><groupId>org.powermock</groupId><artifactId>powermock-core</artifactId><version>2.0.9</version><scope>test</......
  • python爬虫爬取快手视频多线程下载功能【fd的使用】
    环境:python2.7+win10工具:fiddlerpostman安卓模拟器首先,打开fiddler,fiddler作为http/https抓包神器,这里就不多介绍。配置允许https 配置允许远程连接也就是打开http代理 电脑ip:192.168.1.110然后确保手机和电脑是在一个局域网下,可以通信。由于我这边没有安卓......
  • HttpClient的使用
    一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。目前我们使用的浏览器处理这些情况都不会......
  • Tmux 使用教程
    1,Tmux使用教程Tmux使用教程-阮一峰的网络日志(ruanyifeng.com) Tmux是一个终端复用器(terminalmultiplexer),非常有用,属于常用的开发工具。本文介绍如何使用Tmux。一、Tmux是什么?1.1会话与进程命令行的典型使用方式是,打开一个终端窗口(terminalwindow,以下简称"窗......