`

线程池常用几种方式

阅读更多
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. 队列容量...

    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. 当提交一个任务到线程池时,线程池会...

    c++实现的线程池源代码threadpool

    线程池是一种在多线程编程中常用的管理机制,它通过预先创建一组线程并维护一个待执行任务的队列来提高系统效率。在标题提到的"C++实现的线程池源代码threadpool"中,我们可以看到三个压缩包文件:`boost_1_32_0.rar...

Global site tag (gtag.js) - Google Analytics