java线程池的简单实用之ThreadPoolExecutor

1、先看构造函数,(参数最全的一个构造函数)

ThreadPoolExecutor(int corePoolSize,  int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

corePoolSize 核心线程数,就是平时一直存在的线程数
maximumPoolSize 最大的线程数,就是线程池最大的并发
keepAliveTime 空闲多长时间要销毁,配合TimeUnit 实用
TimeUnit 时间单位
workQueue 缓冲队列,就是线程池有maximumPoolSize个线程在工作,这时候又进来任务,先缓存在队列中。
handler 拒绝策略,就是线程池无法接受任务了(队列满,线程池满负荷运行)时的表现

2、demo示例

  1. 先创建一个线程池
       ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 2L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), Executors.defaultThreadFactory(), new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                throw  new RejectedExecutionException("pool 满了");
            }
        });

平时的活跃数是1个线程,最大支持3个,空闲超过2秒的线程会销毁,拒绝策略是抛出异常信息“pool 满了”。

  1. 自定义线程类
    static class MyTask implements Runnable{
        private String name;
        public MyTask() {
        }

        public MyTask(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.err.println(this.name+"run");
        }
    }
  1. 运行线程
 for (int i = 0; i < 10; i++) {
            executor.execute(new MyTask(i+"a"));
        }
  1. 控制台
"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59439,suspend=y,server=n -javaagent:C:\Users\zhangchao\.IntelliJIdea2018.3\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;F:\test\target\classes;F:\Maven_jar\org\springframework\boot\spring-boot-starter-web\2.1.7.RELEASE\spring-boot-starter-web-2.1.7.RELEASE.jar;F:\Maven_jar\org\springframework\boot\spring-boot-starter\2.1.7.RELEASE\spring-boot-starter-2.1.7.RELEASE.jar;F:\Maven_jar\org\springframework\boot\spring-boot\2.1.7.RELEASE\spring-boot-2.1.7.RELEASE.jar;F:\Maven_jar\org\springframework\boot\spring-boot-autoconfigure\2.1.7.RELEASE\spring-boot-autoconfigure-2.1.7.RELEASE.jar;F:\Maven_jar\org\springframework\boot\spring-boot-starter-logging\2.1.7.RELEASE\spring-boot-starter-logging-2.1.7.RELEASE.jar;F:\Maven_jar\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;F:\Maven_jar\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;F:\Maven_jar\org\apache\logging\log4j\log4j-to-slf4j\2.11.2\log4j-to-slf4j-2.11.2.jar;F:\Maven_jar\org\apache\logging\log4j\log4j-api\2.11.2\log4j-api-2.11.2.jar;F:\Maven_jar\org\slf4j\jul-to-slf4j\1.7.26\jul-to-slf4j-1.7.26.jar;F:\Maven_jar\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;F:\Maven_jar\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;F:\Maven_jar\org\springframework\boot\spring-boot-starter-json\2.1.7.RELEASE\spring-boot-starter-json-2.1.7.RELEASE.jar;F:\Maven_jar\com\fasterxml\jackson\core\jackson-databind\2.9.9\jackson-databind-2.9.9.jar;F:\Maven_jar\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;F:\Maven_jar\com\fasterxml\jackson\core\jackson-core\2.9.9\jackson-core-2.9.9.jar;F:\Maven_jar\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.9\jackson-datatype-jdk8-2.9.9.jar;F:\Maven_jar\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.9\jackson-datatype-jsr310-2.9.9.jar;F:\Maven_jar\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.9\jackson-module-parameter-names-2.9.9.jar;F:\Maven_jar\org\springframework\boot\spring-boot-starter-tomcat\2.1.7.RELEASE\spring-boot-starter-tomcat-2.1.7.RELEASE.jar;F:\Maven_jar\org\apache\tomcat\embed\tomcat-embed-core\9.0.22\tomcat-embed-core-9.0.22.jar;F:\Maven_jar\org\apache\tomcat\embed\tomcat-embed-el\9.0.22\tomcat-embed-el-9.0.22.jar;F:\Maven_jar\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.22\tomcat-embed-websocket-9.0.22.jar;F:\Maven_jar\org\hibernate\validator\hibernate-validator\6.0.17.Final\hibernate-validator-6.0.17.Final.jar;F:\Maven_jar\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;F:\Maven_jar\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;F:\Maven_jar\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;F:\Maven_jar\org\springframework\spring-web\5.1.9.RELEASE\spring-web-5.1.9.RELEASE.jar;F:\Maven_jar\org\springframework\spring-beans\5.1.9.RELEASE\spring-beans-5.1.9.RELEASE.jar;F:\Maven_jar\org\springframework\spring-webmvc\5.1.9.RELEASE\spring-webmvc-5.1.9.RELEASE.jar;F:\Maven_jar\org\springframework\spring-aop\5.1.9.RELEASE\spring-aop-5.1.9.RELEASE.jar;F:\Maven_jar\org\springframework\spring-context\5.1.9.RELEASE\spring-context-5.1.9.RELEASE.jar;F:\Maven_jar\org\springframework\spring-expression\5.1.9.RELEASE\spring-expression-5.1.9.RELEASE.jar;F:\Maven_jar\org\projectlombok\lombok\1.18.8\lombok-1.18.8.jar;F:\Maven_jar\org\slf4j\slf4j-api\1.7.26\slf4j-api-1.7.26.jar;F:\Maven_jar\org\springframework\spring-core\5.1.9.RELEASE\spring-core-5.1.9.RELEASE.jar;F:\Maven_jar\org\springframework\spring-jcl\5.1.9.RELEASE\spring-jcl-5.1.9.RELEASE.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2018.3.6\lib\idea_rt.jar" com.example.test.TestThread
Connected to the target VM, address: '127.0.0.1:59439', transport: 'socket'
Exception in thread "main" java.util.concurrent.RejectedExecutionException: pool 满了
	at com.example.test.TestThread$1.rejectedExecution(TestThread.java:15)
	at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
	at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
	at com.example.test.TestThread.main(TestThread.java:19)
0arun
4arun
3arun
1arun
2arun

很明显最大线程数3+缓冲队列2 ,所以最大并发是5个 ,只能5个线程任务run.

以下是完整代码
package com.example.test;

import java.util.concurrent.*;

/**
 * @author 
 * @version 1.0
 * @date 2019/9/3
 */
public class TestThread {
    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 2L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), Executors.defaultThreadFactory(), new RejectedExecutionHandler() {
            @Override
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                throw  new RejectedExecutionException("pool 满了");
            }
        });
        for (int i = 0; i < 10; i++) {
            executor.execute(new MyTask(i+"a"));

        }
    }

    static class MyTask implements Runnable{
        private String name;
        public MyTask() {
        }

        public MyTask(String name) {
            this.name = name;
        }

        @Override
        public void run() {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.err.println(this.name+"run");
        }
    }
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值