文档章节

java线程池的四种方法测试

CarlDing
 CarlDing
发布于 2018/03/21 15:44
字数 657
阅读 20
收藏 0

package cn.hello;

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

/**
 * 描述: 执行一个异步任务你还只是如下new Thread吗? 那你就out太多了,new Thread的弊端如下: a. 每次new
 * Thread新建对象性能差。 b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。 c.
 * 缺乏更多功能,如定时执行、定期执行、线程中断。 相比new Thread,Java提供的四种线程池的好处在于: a.
 * 重用存在的线程,减少对象创建、消亡的开销,性能佳。 b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 c.
 * 提供定时执行、定期执行、单线程、并发数控制等功能。
 *
 * @author dingzhen
 */
public class ThreadPool {

    public static void main(String[] args) {
        CachedThreadPool();
    }

    /**
     * 线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
     */
    public static void CachedThreadPool() {
        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() {

                public void run() {
                    System.err.println(index);
                }
            });
        }
        cachedThreadPool.shutdownNow();
        boolean f = cachedThreadPool.isShutdown();
        System.err.println(f);
    }

    /**
     * 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
     */
    public static void FixedThreadPool() {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        for (int i = 0; i <= 10; i++) {
            final int index = i;
            executorService.execute(new Runnable() {

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

    /**
     * 创建一个定长线程池,支持定时及周期性任务执行。
     */
    public static void ScheduledThreadPool() {
        // 表示延迟3秒执行
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
        scheduledThreadPool.schedule(new Runnable() {

            public void run() {
                System.out.println("delay 3 seconds");
            }
        }, 3, TimeUnit.SECONDS);
        scheduledThreadPool.shutdownNow();
    }
    /*
     * //表示延迟1秒后每3秒执行一次 scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
     *
     * public void run() {
     * System.out.println("delay 1 seconds, and execute every 3 seconds"); } }, 1,
     * 3, TimeUnit.SECONDS);
     */

    /**
     * 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
     *
     */
    public static void SingleThreadExecutor() {
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            final int index = i;
            singleThreadExecutor.execute(new Runnable() {

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

 

© 著作权归作者所有

上一篇: Java实现爬虫示例
下一篇: mybatis
CarlDing
粉丝 5
博文 106
码字总数 78103
作品 0
济南
其他
私信 提问
数据库连接池clearpool(java实现)详解

clearpool的maven项目托管在https://github.com/xionghuiCoder/clearpool,同时也可以在http://www.oschina.net/p/clearpool上了解它的简单介绍。 首先大家可能会问,现在开源社区已经有了很...

xionghuiCoder
2014/08/20
5.4K
16
Java中高级面试必问之多线程TOP50(含答案)

以下为大家整理了今年一线大厂面试被问频率较高的多线程面试题,由于本人的见识局限性,所以可能不是很全面,也欢迎大家在后面留言补充,谢谢。 1、什么是线程? 2、什么是线程安全和线程不安...

老道士
2018/08/28
267
0
深入理解 Java 虚拟机学习(一) -- java 内存区域与内存溢出异常

java 内存区域 要进行 java 虚拟机的深入学习,首先要了解的是 java 的内存划分。大部分程序员一开始接触 java ,对于内存的划分是印象是堆内存和栈内存,而这仅仅适合于入门的学习,实际上 ...

偷星辰夜
2017/09/28
0
0
Tomcat 6 支持 NIO -- Tomcat的四种基于HTTP协议的Connector性能比较

Tomcat从5.5版本开始,支持以下四种Connector的配置分别为: 1.<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8......

恶魔永生
2015/01/15
243
0
ThreadLocal父子线程之间的数据传递问题

一、问题的提出 在系统开发过程中常使用ThreadLocal进行传递日志的RequestId,由此来获取整条请求链路。然而当线程中开启了其他的线程,此时ThreadLocal里面的数据将会出现无法获取/读取错乱...

nonnetta
2018/12/16
166
0

没有更多内容

加载失败,请刷新页面

加载更多

vue入门--简单路由配置

本文转载于:专业的前端网站➜vue入门--简单路由配置   在初始化vue init webpack <工程名>时,有一步是询问是否安装vue-router,选择yes,如果没有安装的话,后面需要自己安装。然后在目录...

前端老手
27分钟前
3
0
怎么给视频配音

很多刚开始尝试视频制作的小伙伴,帮助到怎么给制作完成的视频配音,其实给视频配音的方法非常简单,在手机上可以进行制作,下面一起来看看给视频配音的方法吧! 具体步骤如下: 1、首先在手...

白米稀饭2019
36分钟前
3
0
windows批处理bat脚本编写

什么是bat脚本 .bat结尾的文件其实就是windows上的批处理脚本,Windows中的bat文件相当于 Linux中shell编程的.sh脚本,批量执行DOS命令。 其最简单的例子,是逐行书写在命令行中会用到的各种...

孙幼凌
44分钟前
3
0
华为手机翻译功能怎么使用?这三种方法请务必收藏

华为手机翻译功能怎么使用?在我们的生活中会经常遇到翻译问题,许多外语不好的朋友该怎么办呢?华为手机已经为我们解决了这个问题,今天小编就教大家学会使用华为手机中的三种翻译技巧,需要...

翻译小天才
52分钟前
5
0
企业服务软件开发中需要注意的三个问题

在开发企业服务软件时,我们需要分为:业务需求、用户需求、产品需求,三大需求层次,三个层次互相关联,企业服务软件开发首先要服务业务,需要满足业务的需求,再关注用户体验,也就是用户需...

积木创意科技
55分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部