打造定制线程池:Java多线程的艺术( 三 )

  • 队列选择考虑因素: 选择任务队列类型需要考虑应用程序的需求 。有界队列可以限制并发任务的数量,以防止资源耗?。?但可能导致任务被拒绝 。无界队列不会拒绝任务 , 但需要谨慎使用以避免内存问题 。
  • ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>());在上述示例中,new LinkedBlockingQueue<>()创建了一个无界队列,任务可以无限排队等待执行 。
    任务队列的选择应根据应用程序的性能需求、任务类型和资源约束来决定 。合适的任务队列可以帮助平衡并发性能和资源管理,确保线程池能够高效地处理任务 。
    6、线程工厂(threadFactory)线程工厂(ThreadFactory)是Java线程池中的一个关键组成部分,它用于创建线程池中的线程 。线程工厂定义了线程的创建方式和属性,允许你自定义线程的名称、优先级、异常处理等属性 。线程工厂提供了更灵活的方式来创建线程,以适应特定的应用需求 。
    以下是关于线程工厂的关键特点和用途:
    • 线程创建方式: 线程工厂负责创建线程对象 , 使你能够自定义线程的创建方式 。这包括线程的命名、线程组、优先级和其他属性 。
    • 线程命名: 通过线程工厂,你可以为线程设置有意义的名称,以便更容易进行线程监控和调试 。有意义的线程名称可以帮助识别线程池中正在执行的任务 。
    • 异常处理: 线程工厂还可以自定义线程的异常处理方式 。这对于记录线程异常信息、执行特定的异常处理逻辑等都很有用 。
    • 线程属性: 你可以在线程工厂中设置其他线程属性,如优先级、守护线程标志等 。
    • 线程监控: 自定义线程工厂可以用于在线程池中监控线程的活动,例如记录线程的创建和销毁时间、统计线程执行任务的次数等 。
    ThreadFactory customThreadFactory = new CustomThreadFactory("MyThreadPool-Worker-"); ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), customThreadFactory);在上述示例中,CustomThreadFactory是一个自定义的线程工厂类,它为线程设置了自定义的名称前缀 。
    线程工厂的使用有助于更好地控制线程的行为和属性,使线程池适应不同的应用需求 。它也有助于提高代码的可维护性和可读性,因为可以明确指定线程的属性和行为 。
    7、拒绝策略(handler)拒绝策略(Rejection Policy) , 也被称为拒绝处理策略,是Java线程池中的一个重要参数 。当线程池的任务队列已满并且线程池的工作线程数已经达到最大线程数时,新提交的任务无法被立即执行 。此时 , 拒绝策略定义了应该如何处理这些无法执行的任务 。
    打造定制线程池:Java多线程的艺术

    文章插图
    Java线程池提供了多种不同的拒绝策略 , 你可以根据应用程序的需求来选择合适的策略 。以下是常见的拒绝策略:
    • AbortPolicy(默认策略): 这是默认的拒绝策略 。当任务无法执行时,线程池会抛出一个RejectedExecutionException异常,表示拒绝任务的提交 。这是一种比较严格的策略 , 通常用于保护线程池不被过度负载 。
    • CallerRunsPolicy: 这个策略会将无法执行的任务交给提交任务的线程来执行 。换句话说,任务将在调用submit方法的线程上执行,而不是在线程池的工作线程上执行 。这可以用于降低提交任务的速度,但不会丢失任务 。
    • DiscardPolicy: 这个策略会默默地丢弃无法执行的任务,不会抛出异常,也不会执行任务 。使用这个策略时需要小心,因为任务的丢失可能会导致数据或功能的不一致 。
    • DiscardOldestPolicy: 这个策略会尝试丢弃队列中最旧的任务,以为新任务腾出位置 。虽然可以避免任务的丢失 , 但可能导致某些任务等待时间较长 。
    你可以在创建线程池时通过指定拒绝策略来选择所需的处理方式:
    ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.AbortPolicy());选择适当的拒绝策略取决于你的应用需求 。严格的策略可以帮助保护线程池免受过度负载,但可能导致任务丢失 。较宽松的策略可以避免任务丢失,但可能会降低性能 。因此,需要根据应用程序的性能、可靠性和任务处理需求来选择合适的拒绝策略 。


    推荐阅读