当前位置: 首页 > news >正文

Java-01-源码篇-JUC并发编程-常用类

        JUC 并发模块是java在多线程提供的一种更加合理的设计并发框架。

        J.U.C 是java.util.concurrent 包名称首字母的缩写。J.U.C是为了解决Java在多线程并发环境的性能以及稳定性问题。

        J.U.C 在锁的方面也提供一套新机制的锁,除此外,J.U.C还提供了指定数据类型的同步机制,避免了在进行数据操作时通过方法实现同步的处理了

        首先,了解一下JUC并发包常用的类。

一,ThreadFactory

        一个面向对象的编程语言,就需要进行不断的解耦和设计的考虑,毕竟直接通过关键字 new 进行线程对象的构建,所以,为了更加符合面向对象的设计理念,J.U.C里面提供线程对象的获取机制,提供一个工厂类的标准接口。

package java.util.concurrent;

/**
 * @since 1.5
 * @author Doug Lea
 */
public interface ThreadFactory {

    Thread newThread(Runnable r);
}

        看案例

public static void main(String[] args) {
    CustomThreadFactory customThreadFactory = new CustomThreadFactory("worker", false);
    ExecutorService executorService = Executors.newFixedThreadPool(3, customThreadFactory);

    for (int i = 0; i < 5; i++) {
        executorService.execute(() -> {
            System.out.println(Thread.currentThread().getName() + " is running");
        });
    }

    executorService.shutdown();
}

        输出结果

worker-thread-1 is running
worker-thread-1 is running
worker-thread-1 is running
worker-thread-2 is running
worker-thread-3 is running

二,TimeUint 时间单元

        在实际开发中,不仅仅只要毫秒的线程配置的要求,还可能会用到时,分,秒等等。所以在java里面进一步简化这种时间的计算管理,提供了一个专属的TimeUnit工具类,该工具类是一个枚举类

        该工具类提供了时间常用的时间常量:

package java.util.concurrent;

public enum TimeUnit {
    NANOSECONDS(TimeUnit.NANO_SCALE),	/** 纳秒 */
    MICROSECONDS(TimeUnit.MICRO_SCALE),	/** 微秒 */
    MILLISECONDS(TimeUnit.MILLI_SCALE),	/** 毫秒 */
    SECONDS(TimeUnit.SECOND_SCALE),		/** 秒 */
    MINUTES(TimeUnit.MINUTE_SCALE),		/** 分钟 */
    HOURS(TimeUnit.HOUR_SCALE),			/** 小时 */
    DAYS(TimeUnit.DAY_SCALE);			/** 天 */
    /** 忽略其他代码 */
}

        还提供常用的时间转换方法:

public class TimeUnitExample {
    public static void main(String[] args) {
        long hours = 2; // 2 小时
        long milliseconds = TimeUnit.MILLISECONDS.convert(hours, TimeUnit.HOURS);
        System.out.println(hours + " 小时 = " + milliseconds + " 毫秒");
    }
}

输出结果:

2 小时 = 7200000 毫秒

三,Delayed

3.1 主要用途

        Delayed 是 Java 并发包 (java.util.concurrent) 中的一个接口,主要用于表示带有延迟时间的对象,通常与 延迟队列 (DelayQueue) 一起使用。

public interface Delayed extends Comparable<Delayed> {
    /**
     * 返回当前对象的剩余延迟时间,单位由 unit 指定。
     * 只有当 getDelay() 返回值小于等于 0 时,该对象才可以从队列中取出。
     */
    long getDelay(TimeUnit unit);
}

实现 Comparable<Delayed> 接口

  • Delayed 继承了 Comparable<Delayed>,因此 Delayed 对象需要实现 compareTo() 方法,用于在 DelayQueue 中按照延迟时间进行排序。

Delayed 主要配合 DelayQueue 使用,可用于:

  • 任务调度(定时任务执行)
  • 缓存超时处理(延迟移除缓存)
  • 定时重试机制(如网络请求失败后的重试)

3.2 Demo案例

class DelayedTask implements Delayed {
    private final String name;      // 任务名称
    private final long startTime;  // 任务执行时间(毫秒)

    public DelayedTask(String name, long delayTime) {
        this.name = name;
        this.startTime = System.currentTimeMillis() + delayTime;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        long remainingTime = startTime - System.currentTimeMillis();
        return unit.convert(remainingTime, TimeUnit.MILLISECONDS);
    }

    @Override
    public int compareTo(Delayed o) {
        return Long.compare(this.getDelay(TimeUnit.MILLISECONDS), o.getDelay(TimeUnit.MILLISECONDS));
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Task{" + "name='" + name + '\'' + ", startTime=" + startTime + '}';
    }
}

public class DelayQueueExample {
    public static void main(String[] args) throws InterruptedException {
        DelayQueue<DelayedTask> delayQueue = new DelayQueue<>();

        // 添加任务(分别延迟 3 秒和 5 秒)
        delayQueue.put(new DelayedTask("Task1", 3000));
        delayQueue.put(new DelayedTask("Task2", 5000));

        System.out.println("任务添加完成,稍后执行");

        // 逐个取出任务(只有到达执行时间的任务才能取出)
        while (!delayQueue.isEmpty()) {
            DelayedTask task = delayQueue.take();  // take() 会阻塞,直到可取出
            System.out.println("任务执行: " + task.getName() + " 执行时间: " + System.currentTimeMillis());
        }

        System.out.println("全部执行完成");
    }
}

输出结果

任务添加完成,稍后执行
任务执行: Task1 执行时间: 1743061599626
任务执行: Task2 执行时间: 1743061601630
全部执行完成
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/100658.html

相关文章:

  • 并查集基础模板(java实现)
  • 【力扣hot100题】(019)旋转图像
  • Kubernetes深度解析:云原生时代的容器编排引擎
  • 树莓派5从零开发至脱机脚本运行教程——8.设置静态IP地址篇
  • 【行测】资料分析
  • XML标签格式转换为YOLO TXT格式
  • 通义千问Qwen2.5-Omni:全模态实时交互的下一代多模态大模型
  • 小蓝和钥匙
  • 机器学习stats_linregress
  • Spring Boot 与 Spring Integration 整合教程
  • SQLiteBrowser 的详细说明,内容结构清晰,涵盖核心功能、使用场景及实用技巧
  • skynet中跨协程异步响应的场景
  • k8s污点与容忍
  • golang 的io与os包中的常用方法
  • 5G网络中A端口和Z端口
  • javaSE————文件IO(2)、
  • 【LeetCode 题解】算法:29.两数相除
  • WordPress.com搭建网站指南
  • 力扣HOT100之矩阵:73. 矩阵置零
  • B3637 最长上升子序列
  • OpenLayers:如何使用渐变色
  • 回归预测 | Matlab实现NRBO-Transformer-BiLSTM多输入单输出回归预测
  • 基于 Three.js 实现 3D 数学欧拉角
  • Multism TL494仿真异常
  • 玛卡巴卡的k8s知识点问答题(四)
  • Spring Boot 整合 ElasticJob 分布式任务调度教程
  • pycharm虚拟环境项目转移后配置解释器
  • Spring Boot整合Redis
  • SpringBoot分布式项目订单管理实战:Mybatis最佳实践全解
  • 通俗易懂的大模型原理