Java自定义线程池的使用

简介: Java自定义线程池的使用

自定义线程池

 /***********************自定义线程池*************************/
    /**
     * 手写线程池
     *
     * @param corePoolSize     核心池大小 int
     * @param maximumPoolSize  最大池大小 int
     * @param keepAliveTime    保活时间   long(任务完成后要销毁的延时)
     * @param unit             时间单位    决定参数3的单位,枚举类型的时间单位
     * @param workQueue        工作队列    用于存储任务的工作队列(BlockingQueue接口类型)
     * @param threadFactory    线程工厂    用于创建线程
     * <p>
     * 线程不是越多越好,google工程师推荐  线程个数=cpu核心数+1(例如四核的开5个线程最好)
     */
    // 参数任务上限
    LinkedBlockingQueue<Runnable> blockingQueue = new LinkedBlockingQueue<>(10000);
    ThreadFactory threadFactory = new ThreadFactory() {
        //  int i = 0;  用并发安全的包装类
        AtomicInteger atomicInteger = new AtomicInteger(1);
 
        @Override
        public Thread newThread(Runnable r) {
            //创建线程 吧任务传进来
            Thread thread = new Thread(r);
            // 给线程起个名字
            thread.setName("线程" + atomicInteger.getAndIncrement());
            return thread;
        }
    };
    private final ThreadPoolExecutor pool = new ThreadPoolExecutor(10, 20, 1, TimeUnit.SECONDS, blockingQueue, threadFactory);

调用:

pool.execute(new Runnable() {
  @Override
  public void run() {
   boolean b = redisUtil.setIfAbsent(info.getId().toString(), info.getId(), 300000); //加锁
   if (!b) {
              return;
           }
   try {
              ....
         
       }
      catch(...){
      }
     finally{
 
        redisUtil.del(info.getId().toString()); //解锁
     }
}
 

redis加解锁

public void del(String... key) {
    if (key != null && key.length > 0) {
      if (key.length == 1) {
        redisTemplate.delete(key[0]);
      } else {
        redisTemplate.delete(CollectionUtils.arrayToList(key));
      }
    }
  }
 
 
/**
   * 当键值不存在时,放入
   *
   * @param key   键
   * @param value 值
   * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期
   * @return true成功 false 失败
   */
  public boolean setIfAbsent(String key, Object value, long time) {
    try {
      if (time > 0) {
        return redisTemplate.opsForValue().setIfAbsent(key, value, time, TimeUnit.SECONDS);
      } else {
        return redisTemplate.opsForValue().setIfAbsent(key, value);
      }
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
  }
相关文章
|
9月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
381 4
|
9月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
421 1
|
9月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
390 1
|
10月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
428 0
|
10月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
597 16
|
11月前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
11月前
|
Java 数据库 C++
Java异常处理机制:try-catch、throws与自定义异常
本文深入解析Java异常处理机制,涵盖异常分类、try-catch-finally使用、throw与throws区别、自定义异常及最佳实践,助你写出更健壮、清晰的代码,提升Java编程能力。
|
11月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
12月前
|
XML 人工智能 Java
java通过自定义TraceId实现简单的链路追踪
本文介绍了如何在Spring Boot项目中通过SLF4J的MDC实现日志上下文traceId追踪。内容涵盖依赖配置、拦截器实现、网关与服务间调用的traceId传递、多线程环境下的上下文同步,以及logback日志格式配置。适用于小型微服务架构的链路追踪,便于排查复杂调用场景中的问题。
555 0

热门文章

最新文章