JavaEE初阶(8)——自定义线程池&&自定义定时器

SpringBoot 自定义ThreadPoolTaskScheduler线程池执行定时任务 到此SpringBoot 自定义ThreadPoolTaskScheduler线程池并进行异步操作介绍完成。最近项目中有使用到通过自定义线程池来执行异步操作的配置,特此记录便于日后查阅。 阅读详情

自定义线程池 和 定时器 之前 让我们先学习使用其基本原理

1.学习使用线程池

//使用线程池
public class demo8 {
    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        for (int i = 0; i < 1000; i++) {
            int id=i;
            service.submit(()->{
                System.out.println("hello "+ id+","+Thread.currentThread().getName());
            });
        }
    }
}

结果如下:

2.学习使用定时器

//学习使用定时器
public class demo10 {
    public static void main(String[] args) {
        Timer timer =new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello 1000");
            }
        },3000);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello 2000");
            }
        },2000);
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("hello 3000");
            }
        },1000);
        System.out.println("hello main");
    }
}

结果如下:


3.自定义线程池

//自定义线程池
class MyThreadPool{
    private BlockingQueue<Runnable> queue=null;
    public MyThreadPool(int n){
        //创建容量为1000的 阻塞队列
        queue=new ArrayBlockingQueue<>(1000);

        for (int i = 0; i < n; i++) {
            //循环创建n个线程
            Thread t =new Thread(()->{
                try {
                    //没有任务就等待
                    //如果有 就取
                    while (true) {
                        Runnable task =  queue.take();
                        //执行线程任务
                        task.run();
                    }
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            });
            //每次创建一个线程都要启动
            t.start();
        }
    }
    public void submit(Runnable task) throws InterruptedException {
        queue.put(task);
    }
}

4.自定义定时器

//自定义一个定时器
//1.创建一个类 表示任务
//2.使用一个集合类 把这些任务管理起来——小根堆
//3.实现schedule方法 把任务添加到队列里
//4.额外创建一个线程 负责执行队列里的任务

import java.util.PriorityQueue;

class MytimeTask implements Comparable<MytimeTask> {
    private Runnable task;
    private long time;
    public MytimeTask(Runnable task,long time){
        this.task=task;
        this.time=time;
    }

    public long getTime() {
        return time;
    }

    public void run() {
        task.run();
    }

    @Override
    public int compareTo(MytimeTask o) {
        return (int) (this.time- o.time);
//        return (int) (o.time -this.time);
    }
}
class Mytimer{
    //直接使用this 作为锁对象 也可以
    private Object locker =new Object();
    private PriorityQueue<MytimeTask> queue =new PriorityQueue<>();

    public void schedule(Runnable task,long delay_time){
        synchronized (locker) {
            //以入队列 这个时刻为基准
            MytimeTask mytimeTask =new MytimeTask(task,System.currentTimeMillis()+delay_time);
            queue.offer(mytimeTask);
            locker.notify();
        }
    }
    public Mytimer(){
        Thread t =new Thread(()->{
            try {
                while (true){
                    synchronized (locker) {
                        //取队首元素
                        //使用while更好 可以再次判断是否为空
                        while (queue.isEmpty()){
                            //不能空等 按需等待 按需唤醒
                            //如果使用sleep 时间不好控制
      //                      continue;
                            locker.wait();
                        }
                        MytimeTask task =queue.peek();
                        if(System.currentTimeMillis()< task.getTime()){
                            //如果时机未到
//                            continue;
                            locker.wait(task.getTime()-System.currentTimeMillis());
                        }else {
                            //时间到了 执行任务
                            task.run();
                            queue.poll();
                        }
                    }
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        });
        t.start();
    }
}

【复习8-13天】每天40min,我们一起用70天稳扎稳打学完《JavaEE初阶》——14/70 第十四天 理解双重 if 判定 / volatile:加锁 / 解锁是一件开销比较高的事情. 而懒汉模式的线程不安全只是发生在首次创建实例的时候.因此后续使用的时候, 不必再进行加锁了.外层的 if 就是判定下看当前是否已经把 instance 实例创建出来了同时为了避免 “内存可见性” 导致读取的 instance出现偏差, 于是补充上 volatile .当多线程首次调用 getInstance, 大家可能都发现 instance 为 null, 于是又继续往下执行来竞争锁, 阅读详情

相关推荐

自定义实现Java线程池

自定义实现Java线程池,学习大师设计思想,瞻仰大神笔法

线程池&定时器

在使用标准库中的线程池时需要传太多参数,我们不使用这个类,我们使用一个粗略的线程池下面是一些常见的线程池这里的一些类都是Executors类,是简便的线程池类,我们平时使用这些方法就不必担心传参太多太繁琐的问题了。

求你们看我的博客 1048

java 定时器线程池(ScheduledThreadPoolExecutor)的实现

主要介绍了java 定时器线程池(ScheduledThreadPoolExecutor),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

java如何自定义线程线程池

选择合适的任务队列(:根据应用场景选择适当的任务队列类型。自定义线程工厂(:通过自定义线程工厂,可以为线程设置特定的名称、优先级等。选择或自定义拒绝策略(:根据任务负载情况选择合适的拒绝策略,或者自定义拒绝策略。配置核心线程数和最大线程数:根据实际需求合理配置核心线程数和最大线程数。配置空闲线程存活时间:根据任务的执行时间和频率,设置适当的空闲线程存活时间。下面是一个自定义线程池的示例,其中包含了自定义线程工厂、自定义拒绝策略,并使用了作为任务队列。// 自定义线程工厂类。

Flying_Fish_roe的博客 1578

Python实战:用NumPy实现LU分解与QR分解(附代码对比)

本文深入探讨了使用NumPy实现LU分解与QR分解的实战方法,通过代码对比分析了两种矩阵分解技术的原理、数值稳定性差异及核心应用场景。LU分解适用于高效求解线性方程组,而QR分解凭借其正交化特性,在求解最小二乘问题和处理病态矩阵时更具优势。文章提供了详细的Python代码示例,帮助开发者根据具体问题选择最合适的分解方法。

php55的博客 1212

深入解析Buck开关电源中的死区时间设计及其对系统性能的影响

本文深入解析了Buck开关电源中死区时间的设计原理及其对系统性能的关键影响。死区时间通过防止上下管同时导通来避免穿通电流,确保系统安全。文章详细探讨了其工作机制、设置时的效率与安全权衡,以及不当设置对效率、稳定性和EMI的连锁反应,并提供了基于实测的调试方法与实战案例。

Apple的专栏 1129

自定义动态定时任务线程池(动态线程池大小+周期执行任务)

默认的使用 static ScheduledThreadPoolExecutorDynamic scheduledExecutorService = new ScheduledThreadPoolExecutorDynamic(2 * Runtime.getRuntime().availableProcessors()); 但是当创建定时任务超过corepoolsize的大小后,会将任务添加...

qq_18453581的博客 1671

ABAP ALV编辑后触发事件

1.FUNCTION ALV在it_events的参数中,写入对应的事件。2.OO ALV和FUNCTION ALV都可以,注册当前ALV的事件,对应的事件需要创建对象去实现。下面代码中,实现的是第一种,在it_events中写入事件。下面的代码是通过创建对象去实现ALV事件。

a86632678的博客 3852

【Java并发学习四】如何实现一个定时线程池

在【Java并发学习一】如何实现一个线程池上进行扩展,我们想一下如何实现一个定时任务线程池呢? 所谓 “定时任务线程池” 就是指放入线程池的任务,可以按照指定的等待周期循环执行。 Java里面ScheduledThreadPoolExecutor这个类实现了这种功能。Spring里面的定时任务也是在ScheduledThreadPoolExecutor的基础上扩展而来。 如何实现 我们...

大树的学习之路 6362

图神经网络学习笔记-点云数据处理(专题七)

本教程解释了如何利用图神经网络(Graph Neural Networks,GNNs)来处理和训练点云数据。尽管点云默认情况下不具有图结构,但我们可以利用 PyG 的转换工具,将其转化为适合 PyG 所提供的全套 GNN 模型的形式。关键思想是从点云数据中创建一个,通过 GNN 的消息传递机制,从中学习有意义的局部几何结构。这些点的表示可以被用于例如点云分类或分割等任务。

351

金三银四!风控建模岗面试题库大全:从理论到实战避坑指南

风控建模面试大全

阿黎逸阳的博客 767

JAVAEE初阶01

多线程、线程安全相关

2401_83147199的博客 1618

YOLOv8首创原创改进:即插即用|创新的轻量化非对称多级压缩LADH检测头

总结而言,本文介绍了一种名为轻量化非对称多级压缩LADH检测头的原创改进,该改进可与YOLOv8无缝适配,并显著提升了检测器的性能。在本文中,我们介绍了一种原创改进的检测头,名为轻量化非对称多级压缩LADH检测头,它可与YOLOv8无缝适配,显著提升了检测器的性能。此外,我们引入了多级压缩的概念,通过在不同的检测层级上应用不同程度的压缩,进一步提升了检测头的轻量化特性。具体而言,我们采用了逐级减少卷积核数量和通道数量的策略,以降低模型的参数量和计算复杂度,同时保持较高的检测精度。

IbcVue的博客 2180

【JavaEE】线程池

线程池知识~

做梦都想要三十万年薪~ 2160

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【JavaEE】 多线程-初阶

多个线程组成了一个进程,线程好比是一跟光纤中的一个玻璃丝,进程是整根光纤。一个进程中的线程共享这个进程中的资源(内存、硬盘)

这个人很勤快,但还是什么也没有。 466

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JAVAEE-8-线程池

class MyThreadPoolExecutor{//自定义线程池//用来存储后续设定的线程,方便后续处理//用来存储执行任务的队列public MyThreadPoolExecutor(int n){//n为线程池创建出来的线程数目i<n;i++){try {//取出需要执行的任务,这里的队列使用take,是带有阻塞功能的//取出来之后进行使用});t.start();//这里进行放入任务。

m0_73700505的博客 614

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JavaEE线程(初阶)

由0 1组成一串计算机能识别的二进制内容;是指导 CPU 进⾏⼯作的命令,也是cpu上执行任务的基本单位,主要由操作码被操作数组成。操作码⽤来表⽰要做什么动作被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号等。(2).内存指针:指令是保存在内存中的,而内存指针可以指出内存哪部分放数据哪部分放指令每个应⽤程序运⾏于现代操作系统之上时,操作系统会提供⼀种抽象的表示这个应用程序运行--进程;简单点就是,操作系统会把exe文件加载到内存中并创建一个集合来表示这个应用,而集合内部是。

2401_87215410的博客 6093

【JavaEE】——线程池大总结

线程数量问题解决方式,代码实现线程池,ThreadPoolExecutor(核心构造方法),参数的解释(面试:拒绝策略),Executors,工厂模式,工厂类

阿华的博客 2007

《JavaEE》线程池

其实学到现在 大家已经对池这个概念有了简单的理解了 这个池的主要功能就是为了提升程序执行效率的 不知大家是否还记得“常量池” 在SE阶段我们接触了这个常量池 这个池的功能就是为了减少冗余的创建 如果要用到池中有的数据 直接取出来省去了创建的时间 线程池也是一样的概念 主要功能就是为了提升程序的执行效率 线程池中存放的跟常量池中的不同 线程池顾名思义存放的就是线程 当需要线程来执行任务的时候 取出对应数量的线程去执行所需要执行的任务。我们有多少任务 是可以明确知道的 相比较而言 我们用户态是更加可控的。

1 517

【JavaEE】-- 多线程(初阶)4

本文介绍了Java中单例模式的两种实现方式:饿汉模式和懒汉模式。饿汉模式在类加载时就完成对象初始化,保证线程安全但可能浪费资源;懒汉模式采用延迟加载,首次使用时才创建对象,但需通过双重检查锁定机制解决多线程环境下的线程安全问题。文章详细分析了懒汉模式在多线程场景下的执行流程和锁优化策略,指出外层加锁配合双重检查能有效避免重复创建对象和资源浪费,是更优的实现方案。两种模式各有特点,开发者应根据实际场景选择合适方案。

2303_80341387的博客 1019

多线程(JavaEE初阶系列6)

手动实现一个线程池。

weixin_61599986的博客 734

【javaEE】多线程(基础)

一个线程就是一个 " 执行流 ". 每个线程之间都可以按照顺序执行自己的代码 . 多个线程之间 " 同时 " 执行着多份代码。

Easonmax的博客 1318

JavaEE初阶-多线程易忘点总结

多线程中易忘知识简单总结。

qq_45965652的博客 1568

【JavaEE】多线程04—线程池/定时器

线程池(ThreadPoolExecutor参数详解-核心线程数/最大线程数/空闲存活时间/任务队列/工厂模式/拒绝策略)、模拟实现线程池、定时器(Timer)、模拟实现定时器

Zzzzmo_的博客 387
上一篇: JavaEE初阶(7)——线程池的基本概念
下一篇: JavaEE进阶(1)——锁与synchronized
FrantF
博客等级 码龄3年 5粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值