文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java自带的四种线程池是什么

2023-06-30 10:31

关注

这篇文章主要讲解了“java自带的四种线程池是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java自带的四种线程池是什么”吧!

java预定义的哪四种线程池?

四种线程池有什么区别?

上面四种线程池类都继承ThreadPoolExecutor,在创建时都是直接返回new ThreadPoolExecutor(参数),它们的区别是定义的ThreadPoolExecutor(参数)中参数不同,而ThreadPoolExecutor又继承ExecutorService接口类

定义:
xecutorService executorService=Executors.newFixedThreadPool(2);

java自带的四种线程池是什么

缺点:使用了LinkBlockQueue的链表型阻塞队列,当任务的堆积速度大于处理速度时,容易堆积任务而导致OOM内存溢出

定义:ExecutorService executorService =Executors.newSingleThreadExecutor();

java自带的四种线程池是什么

上面代码神似new FixedThreadPoop(1),但又有区别,因为外面多了一层FinalizableDelegatedExecutorService,其作用:

java自带的四种线程池是什么

可知,fixedExecutorService的本质是ThreadPoolExecutor,所以fixedExecutorService可以强转成ThreadPoolExecutor,但singleExecutorService与ThreadPoolExecutor无任何关系,所以强转失败,故newSingleThreadExecutor()被创建后,无法再修改其线程池参数,真正地做到single单个线程。

缺点:使用了LinkBlockQueue的链表型阻塞队列,当任务的堆积速度大于处理速度时,容易堆积任务而导致OOM内存溢出

newCacheThreadPool

定义:ExecutorService executorService=Executors.newCacheThreadPool();

java自带的四种线程池是什么

缺点:SynchronousQueue是BlockingQueue的一种实现,它也是一个队列,因为最大线程数为Integer.MAX_VALUE,所有当线程过多时容易OOM内存溢出

ScheduledThreadPool

定义:ExecutorService executorService=Executors.newScheduledThreadPool(2);

源码:public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {        //ScheduledThreadPoolExecutor继承ThreadPoolExecutor        return new ScheduledThreadPoolExecutor(corePoolSize);    }    public ScheduledThreadPoolExecutor(int corePoolSize) {    //ScheduledThreadPoolExecutor继承ThreadPoolExecutor,故super()会调用ThreadPoolExecutor的构造函数初始化并返回一个ThreadPoolExecutor,而ThreadPoolExecutor使实现ExecutorService接口的    //最终ScheduledThreadPoolExecutor也和上面几种线程池一样返回的是ExecutorService接口的实现类ThreadPoolExecutor    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,          new DelayedWorkQueue());}

线程池有哪几个重要参数?

ThreadPoolExecutor构造方法如下:

java自带的四种线程池是什么

java自带的四种线程池是什么

如何自定义线程池

可以使用有界队列,自定义线程创建工厂ThreadFactory和拒绝策略handler来自定义线程池

public class ThreadTest {    public static void main(String[] args) throws InterruptedException, IOException {        int corePoolSize = 2;        int maximumPoolSize = 4;        long keepAliveTime = 10;        TimeUnit unit = TimeUnit.SECONDS;        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(2);        ThreadFactory threadFactory = new NameTreadFactory();        RejectedExecutionHandler handler = new MyIgnorePolicy();       ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit,                workQueue, threadFactory, handler);        executor.prestartAllCoreThreads(); // 预启动所有核心线程                for (int i = 1; i <= 10; i++) {            MyTask task = new MyTask(String.valueOf(i));            executor.execute(task);        }        System.in.read(); //阻塞主线程    }    static class NameTreadFactory implements ThreadFactory {        private final AtomicInteger mThreadNum = new AtomicInteger(1);        @Override        public Thread newThread(Runnable r) {            Thread t = new Thread(r, "my-thread-" + mThreadNum.getAndIncrement());            System.out.println(t.getName() + " has been created");            return t;        }    }    public static class MyIgnorePolicy implements RejectedExecutionHandler {        @Override        public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {            doLog(r, e);        }        private void doLog(Runnable r, ThreadPoolExecutor e) {            // 可做日志记录等            System.err.println( r.toString() + " rejected");//          System.out.println("completedTaskCount: " + e.getCompletedTaskCount());        }    }    static class MyTask implements Runnable {        private String name;        public MyTask(String name) {            this.name = name;        }        @Override        public void run() {            try {                System.out.println(this.toString() + " is running!");                Thread.sleep(3000); //让任务执行慢点            } catch (InterruptedException e) {                e.printStackTrace();            }        }        public String getName() {            return name;        }        @Override        public String toString() {            return "MyTask [name=" + name + "]";        }    }}

运行结果:

java自带的四种线程池是什么

其中7-10号线程被拒绝策略拒绝了,1、2号线程执行完后,3、6号线程进入核心线程池执行,此时4、5号线程在任务队列等待执行,3、6线程执行完再通知4、5线程执行

感谢各位的阅读,以上就是“java自带的四种线程池是什么”的内容了,经过本文的学习后,相信大家对java自带的四种线程池是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯