zoukankan      html  css  js  c++  java
  • 自定义线程池

    转自:https://www.cnblogs.com/nele/p/6502750.html

    线程池执行的流程:

    当任务提交给ThreadPoolExecutor 线程池中,先检查核心线程数是否已经全部使用,

    如果没有交由核心线程去执行任务,

    如果核心线程数已经全部占用,则将任务添加到队列里面,

    如果队列已经占满,比较当前线程池的中线程的数量是不是与超过maximumPoolSize如果没有查过则创建线程去执行。

    也就是说线程池最多可以接受多少任务呢?就是maximumPoolSize+队列的大小。

    当线程池中的线程的数量大于corePoolSize数量有空闲线程则执行回收,回收时间是keepAliveTime单位是unit,都是初始化的时候设置的。

    下面通过代码来说明:

    定义一个实现了Runnable接口的类,当作任务类:

    package com.ctrip.ck.test.thread.pool;
    
    public class MyTask implements Runnable {
        private int taskId;
        private String taskName;
    
        public MyTask(int taskId, String taskName) {
            this.taskId = taskId;
            this.taskName = taskName;
        }
    
        //getter/setter
        public int getTaskId() {
            return taskId;
        }
        public void setTaskId(int taskId) {
            this.taskId = taskId;
        }
    
        public String getTaskName() {
            return taskName;
        }
        public void setTaskName(String taskName) {
            this.taskName = taskName;
        }
    
    
        @Override
        public void run() {
            System.out.println("taskId:" + taskId + ",taskName:" + taskName);
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
    }
    View Code

    定义如下的线程池:

    private static ThreadPoolExecutor pool = new ThreadPoolExecutor(// 自定义一个线程池
    1, // coreSize
    2, // maxSize
    60, // 60s
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(3), // 有界队列,容量是3
    Executors.defaultThreadFactory(),
    new ThreadPoolExecutor.AbortPolicy()
    );


    测试类
     1 import java.util.concurrent.ArrayBlockingQueue;
     2 import java.util.concurrent.Executors;
     3 import java.util.concurrent.ThreadPoolExecutor;
     4 import java.util.concurrent.TimeUnit;
     5 
     6 public class PoolTest {
     7     private static ThreadPoolExecutor pool = new ThreadPoolExecutor(// 自定义一个线程池
     8             1,      // coreSize
     9             2,  // maxSize
    10             60,    // 60s
    11             TimeUnit.SECONDS,
    12             new ArrayBlockingQueue<>(3), // 有界队列,容量是3个
    13             Executors.defaultThreadFactory(),
    14             new ThreadPoolExecutor.AbortPolicy()
    15     );
    16 
    17     public static void main(String[] args) {
    18         pool.execute(new MyTask(1, "任务1"));
    19         System.out.println("活跃的线程数:" + pool.getActiveCount() + ",核心线程数:" + pool.getCorePoolSize() + ",线程池大小:" + pool.getPoolSize() + ",队列的大小" + pool.getQueue().size());
    20 
    21         pool.execute(new MyTask(2, "任务2"));
    22         System.out.println("活跃的线程数:" + pool.getActiveCount() + ",核心线程数:" + pool.getCorePoolSize() + ",线程池大小:" + pool.getPoolSize() + ",队列的大小" + pool.getQueue().size());
    23 
    24         pool.execute(new MyTask(3, "任务3"));
    25         System.out.println("活跃的线程数:" + pool.getActiveCount() + ",核心线程数:" + pool.getCorePoolSize() + ",线程池大小:" + pool.getPoolSize() + ",队列的大小" + pool.getQueue().size());
    26 
    27         pool.execute(new MyTask(4, "任务4"));
    28         System.out.println("活跃的线程数:" + pool.getActiveCount() + ",核心线程数:" + pool.getCorePoolSize() + ",线程池大小:" + pool.getPoolSize() + ",队列的大小" + pool.getQueue().size());
    29 
    30         pool.execute(new MyTask(5, "任务5"));
    31         System.out.println("活跃的线程数:" + pool.getActiveCount() + ",核心线程数:" + pool.getCorePoolSize() + ",线程池大小:" + pool.getPoolSize() + ",队列的大小" + pool.getQueue().size());
    32 
    33         pool.execute(new MyTask(6, "任务6"));
    34         System.out.println("活跃的线程数:" + pool.getActiveCount() + ",核心线程数:" + pool.getCorePoolSize() + ",线程池大小:" + pool.getPoolSize() + ",队列的大小" + pool.getQueue().size());
    35 
    36         pool.shutdown();
    37         System.out.println("------ over ------");
    38     }
    39 
    40 }
    View Code

    运行结果:

     1 活跃的线程数:1,核心线程数:1,线程池大小:1,队列的大小0
     2 活跃的线程数:1,核心线程数:1,线程池大小:1,队列的大小1
     3 taskId:1,taskName:任务1
     4 活跃的线程数:1,核心线程数:1,线程池大小:1,队列的大小2
     5 活跃的线程数:1,核心线程数:1,线程池大小:1,队列的大小3
     6 活跃的线程数:2,核心线程数:1,线程池大小:2,队列的大小3
     7 Exception in thread "main" taskId:5,taskName:任务5
     8 java.util.concurrent.RejectedExecutionException: Task com.ctrip.ck.test.thread.pool.MyTask@3532ec19 rejected from java.util.concurrent.ThreadPoolExecutor@68c4039c[Running, pool size = 2, active threads = 2, queued tasks = 3, completed tasks = 0]
     9     at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
    10     at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
    11     at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
    12     at com.ctrip.ck.test.thread.pool.PoolTest.main(PoolTest.java:36)
    13 taskId:2,taskName:任务2
    14 taskId:3,taskName:任务3
    15 taskId:4,taskName:任务4
  • 相关阅读:
    在Linux服务器上添加ip白名单允许ssh登录访问
    crontab + shell脚本实现文件重命名
    mysql数据库提示ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
    附加题2:中文编程的发展角度
    附加题1:实体店的未来存在形式
    第八周作业
    第七周作业
    第六周作业
    第五周作业
    第四周作业
  • 原文地址:https://www.cnblogs.com/ylz8401/p/12976102.html
Copyright © 2011-2022 走看看