`

线程池常用几种方式

阅读更多
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


/**
 * 1,直接提交队列:SynchronousQueue队列,提交的任务不会被保存,总是会马上提交执行。
 * 2,有界任务队列:ArrayBlockingQueue,有任务对时候直接创建线程,如果thread 数量大于 corePoolSize,则将新的任务加入到等待队列ArrayBlockingQueue中(有初始化大小),如果等待队列已满,则继续创建线程,如果数量 大于 maximumPoolSize,则执行拒绝策略。
 * 3,无界的任务队列:LinkedBlockingQueue,线程池的任务可以无限制的添加新的任务,而线程池创建对最大线程数量就是corePoolSize的数量,此处maximumPoolSize参数无效,超出corePoolSize数量的新任务都是进入任务队列。
 * 4,优先任务队列:PriorityBlockingQueue它其实是一个特殊的无界队列,线程池创建的线程数也不会超过corePoolSize的数量,只不过其他队列一般是按照先进先出的规则处理任务,而PriorityBlockingQueue队列可以自定义规则根据任务的优先级顺序先后执行
 * @Description: 
 * @author: zhangjianshou  
 * @date: 2019年9月9日 下午2:28:20
 */
public class ThreadPool1 {

    private static ThreadPoolExecutor pool;

    public static void main(String[] args) {
        /**
         * int corePoolSize, 指定了线程池中的线程数量,它的数量决定了添加的任务是开辟新的线程去执行,还是放到workQueue任务队列中去;
         * int maximumPoolSize, 指定了线程池中的最大线程数量,这个参数会根据你使用的workQueue任务队列的类型,决定线程池会开辟的最大线程数量;
         * long keepAliveTime, 当线程池中空闲线程数量超过corePoolSize时,多余的线程会在多长时间内被销毁;
         * TimeUnit unit, 
         * BlockingQueue<Runnable> workQueue, 任务队列,被添加到线程池中,但尚未被执行的任务;它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种;
         * ThreadFactory threadFactory, 线程工厂,用于创建线程,一般用默认即可;
         * RejectedExecutionHandler handler, 拒绝策略;当任务太多来不及处理时,如何拒绝任务;
         */
        
        // maximumPoolSize设置为2 ,拒绝策略为AbortPolic策略,直接抛出异常
        /**
         * 第一种
         */
        //  pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new SynchronousQueue<Runnable>(),
        //  Executors.defaultThreadFactory(), new MyRejectedExecutionHandler());
        /**
         * 第二种
         * ArrayBlockingQueue,初始容量5
         */
        pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(5),
                Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        
        /**
         * 第三种
         */
        //   pool = new ThreadPoolExecutor(1, 2, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(),
        //   Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
        for (int i = 0; i < 3; i++) {
            pool.execute(new ThreadTask());
        }
    }
}

class ThreadTask implements Runnable {
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

/**
 * @Description: 拒绝策略,直接调用当前调用者线程资源 来执行run方法
 * @author: zhangjianshou  
 * @date: 2019年9月9日 下午4:34:27
 */
class MyRejectedExecutionHandler implements RejectedExecutionHandler {

    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        // TODO Auto-generated method stub
       System.out.println("拒绝策略);
       r.run();
    }
}
分享到:
评论

相关推荐

    JAVA线程池原理以及几种线程池类型介绍

    ### JAVA线程池原理及几种线程池类型的详细介绍 #### 一、线程池的引入背景及重要性 在现代软件开发中,特别是在基于Java的应用程序设计中,线程池技术已经成为提高系统性能和资源利用率的关键手段之一。线程池...

    浅谈java常用的几种线程池比较

    Java线程池是一种高效管理线程的工具,它允许开发者预先配置一定数量的线程,以处理并发任务,而不是每次需要处理任务时才创建新线程。线程池的使用可以减少线程创建和销毁的开销,提高系统资源利用率,并能够通过...

    java 线程池

    Java中的线程有以下几种基本状态: 1. **新建状态 (New)**:当使用`new Thread()`创建了一个线程对象但还未调用`start()`方法时,线程处于新建状态。 2. **就绪状态 (Ready)**:当调用线程的`start()`方法之后,该...

    visual c++实现线程池的例子threadpooldemosrc.rar

    线程池是一种编程模型,它在多线程编程中扮演着重要的角色,特别是在高并发和高效能的应用场景中。在Windows环境下,Visual C++(VC++)提供了多种方式来实现线程池,其中包括使用Microsoft的 ConcRT(Concurrent ...

    Java实现的线程池、消息队列功能

    线程池的创建通常涉及以下几个关键参数: 1. 核心线程数(Core Pool Size):线程池的基本大小,即使没有任务,也会保持这些线程。 2. 最大线程数(Maximum Pool Size):线程池能容纳的最大线程数量。 3. 队列容量...

    基于UNIX C语言的一种线程池实现.pdf

    线程池是一种常用的设计模式,能够提高系统的性能和可扩展性。 二、线程池的重要性 线程池是现代软件系统中常用的设计模式之一。它能够提高系统的性能和可扩展性,减少系统的资源开销。线程池的实现有很多种方案,...

    JAVA集中常用的线程池比较共8页.pdf.zip

    本文将深入探讨Java中线程池的常用实现,主要基于Java的`java.util.concurrent`包下的`ExecutorService`接口及其实现,包括`ThreadPoolExecutor`、`Executors`提供的几种静态工厂方法创建的线程池,以及`ForkJoin...

    C++线程池实现 vc2015编译

    在C++编程中,线程池是一种管理线程的有效机制,它可以提高程序的并发性能,减少线程创建和销毁的开销。线程池的概念基于池化资源的思想,即预先创建一组线程,当需要执行任务时,从池中获取空闲线程,而不是每次都...

    C实现线程池

    在多线程编程中,线程池是一种常用的资源管理技术,可以有效地控制运行中的线程数量,重用已创建的线程,减少创建和销毁线程的开销,提高响应速度和处理能力。本文将详细介绍如何在C语言中实现一个简单的线程池。 #...

    java线程池

    线程池的核心类是`java.util.concurrent.ThreadPoolExecutor`,它提供了一种灵活的方式来控制线程的数量、任务的调度以及对拒绝任务的处理。 线程池的构造方法`ThreadPoolExecutor(int corePoolSize, int ...

    Java常用线程池原理及使用方法解析

    Java线程池是一种高效管理线程的工具,它允许开发者预先创建一组线程,当需要执行新任务时,线程池会从池中选择一个空闲线程来执行任务,而不是每次都创建新的线程。线程池的使用有助于减少线程创建和销毁的开销,...

    面试必备:Java线程池解析.pdf

    工作队列作为线程池的重要组件,主要有以下几种: - ArrayBlockingQueue:基于数组的有界阻塞队列。 - LinkedBlockingQueue:基于链表的可选有界阻塞队列。 - SynchronousQueue:不存储元素的阻塞队列,提交任务...

    ExecutorService线程池

    在Java中,线程池主要由以下几种核心组件构成: 1. **工作线程(Worker Threads)**:线程池中的线程,负责执行提交到线程池的任务。 2. **任务队列(Task Queue)**:用于存储待处理的任务,线程从队列中取出任务...

    vc7采用模板实现的线程池

    线程池是一种优化资源管理的机制,它在多线程编程中扮演着重要角色。在VC7(Visual Studio 2003)这样的环境中,线程池的实现可以帮助开发者更高效地利用系统资源,减少线程创建和销毁的开销。下面我们将详细探讨...

    c#几种常用的设计模式

    以下是对标题和描述中提到的几种常用C#设计模式的详细解释: 1. **单例模式(Singleton)**: - 单例模式确保一个类只有一个实例,并提供全局访问点。在C#中,通常通过私有化构造函数和静态成员来实现。这样可以...

    线程池Thread

    线程池是Java多线程编程中的一个重要概念,它是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池能够有效地管理和控制线程,避免过多的线程创建和销毁带来的性能开销,...

    简单的线程池

    线程池是一种在多线程编程中常用的管理机制,它允许多个任务或工作单元被组织成一个统一的集合,并由一个中央调度器分发到一组预先创建的线程中执行。这种设计模式提高了系统资源的利用率,减少了线程创建和销毁的...

    Java分布式应用学习笔记07线程池应用

    在Java中,`java.util.concurrent.ExecutorService`接口提供了创建和管理线程池的能力,而`ThreadPoolExecutor`类则是其最常用的实现之一。`ThreadPoolExecutor`允许我们自定义线程池的关键参数,如核心线程数、最大...

    多线程简单应用-线程池

    另一个常用的是Executors工具类,它提供了一些静态工厂方法,方便地创建不同类型的线程池,如固定大小的线程池、单线程线程池和缓存线程池。 线程池的工作流程大致如下: 1. 当提交一个任务到线程池时,线程池会...

Global site tag (gtag.js) - Google Analytics