千家信息网

java中如何使用线程池

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,本篇文章给大家分享的是有关java中如何使用线程池,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。public ThreadPoolExe
千家信息网最后更新 2025年12月03日java中如何使用线程池

本篇文章给大家分享的是有关java中如何使用线程池,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

public ThreadPoolExecutor(int corePoolSize,                              int maximumPoolSize,                              long keepAliveTime,                              TimeUnit unit,                              BlockingQueue workQueue,                              ThreadFactory threadFactory,                              RejectedExecutionHandler handler) {        if (corePoolSize < 0 ||            maximumPoolSize <= 0 ||            maximumPoolSize < corePoolSize ||            keepAliveTime < 0)            throw new IllegalArgumentException();        if (workQueue == null || threadFactory == null || handler == null)            throw new NullPointerException();        this.acc = System.getSecurityManager() == null ?                null :                AccessController.getContext();        this.corePoolSize = corePoolSize;        this.maximumPoolSize = maximumPoolSize;        this.workQueue = workQueue;        this.keepAliveTime = unit.toNanos(keepAliveTime);        this.threadFactory = threadFactory;        this.handler = handler;    }                构造函数的参数含义如下:corePoolSize:指定了线程池中的线程数量,它的数量决定了添加的任务是开辟新的线程去执行,还是放到workQueue任务队列中去;maximumPoolSize:指定了线程池中的最大线程数量,这个参数会根据你使用的workQueue任务队列的类型,决定线程池会开辟的最大线程数量;keepAliveTime:当线程池中空闲线程数量超过corePoolSize时,多余的线程会在多长时间内被销毁;unit:keepAliveTime的单位workQueue:任务队列,被添加到线程池中,但尚未被执行的任务;它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种;threadFactory:线程工厂,用于创建线程,一般用默认即可;handler:拒绝策略;当任务太多来不及处理时,如何拒绝任务;
package com.test;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class TestThreadPool {        public static void main(String[] args) {                /**                 * 线程数量                 * 最大数量 超标后会进入队列、队列超标后触发策略                 *                  * ArrayBlockingQueue 有界队列                 * LinkedBlockingQueue 无界队列                 * SynchronousQueue 同步队列                 *                  * 执行线程超标策略 RejectedExecutionHandler                 * ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。                  * ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。                  * ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)                 * ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务                 * 自定义                 * Executors.newCachedThreadPool();        //创建一个缓冲池,缓冲池容量大小为Integer.MAX_VALUE                 * Executors.newSingleThreadExecutor();   //创建容量为1的缓冲池                 * Executors.newFixedThreadPool(int);    //创建固定容量大小的缓冲池                 *                 */                ThreadPoolExecutor pool=new ThreadPoolExecutor(5, 5, 1, TimeUnit.SECONDS, new ArrayBlockingQueue(2),new RejectedExecutionHandler() {                        @Override                        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {                         System.out.println(r+"丢弃了");                        }                });                                for(int i=0;i<7;i++) {                        Runnable run=new TestThread(i);                        pool.execute(run);                }                //pool.shutdown();        }}class TestThread implements Runnable {        private int i;                public TestThread(int i) {                this.i=i;        }                @Override        public void run() {                try {                        Thread.sleep(100);                } catch (InterruptedException e) {                        e.printStackTrace();                }                System.out.println(Thread.currentThread().getName()+" "+i);        }}

以上就是java中如何使用线程池,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0