线程池基础

package com.how2java.tmall.train.ThreadPool;

import java.util.concurrent.*;

import static java.util.concurrent.TimeUnit.NANOSECONDS;

/**
 * @Author: yslu
 * @Date: 2019-09-30 8:44
 * @description:
 */
public class ThreadPoolExecutorDemo {
    public static void main(String[] args) {
        /**
         * 1.FixedThreadPool  固定线程池方式启用线程
         * 特点:最大线程数等于核心线程数,使用无界阻塞队列
         * 可用于Web服务瞬时削峰,但需注意长时间持续高峰情况造成的队列阻塞。
         */
        ExecutorService executor2 = new ThreadPoolExecutor(5, 5,
                0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());

        /**
         * 2.SingleThreadExecutor 单线程线程池
         * 特点:最大线程数等于核心线程数等于1,使用无界阻塞队列
         * 可用于系统在某个时间唯一执行的任务
         */
        ExecutorService executor3 = new ThreadPoolExecutor(1, 1,
                0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());

        /**
         * 3.CachedThreadPool 缓存线程池
         * 特点:最大线程数为Integer.MAX_VALUE,即无限大,keepAliveTime = 60s,线程空闲60s后自动结束并回收
         * workQueue 为 SynchronousQueue 同步队列,这个队列类似于一个接力棒,入队出队必须同时传递,
         * 因为CachedThreadPool线程创建无限制,不会有队列等待,所以使用SynchronousQueue;
         * 快速处理大量耗时较短的任务,如Netty的NIO接受请求时,可使用CachedThreadPool。
         */
        ExecutorService executor4 = new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());

        /**
         * 执行延时任务
         */
        ExecutorService executor = new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                0, NANOSECONDS, new DelayQueue());
        Executors.newScheduledThreadPool(5);
        for (int i = 0; i < 10; i++) {
            //创建WorkerThread对象(WorkerThread类实现了Runnable 接口)
            Runnable worker = new WorkerThread("" + i);
            //执行Runnable
            executor.execute(worker);
        }
        //终止线程池
        executor.shutdown();
//        while (!executor.isTerminated()) {
//        }
        System.out.println("Finished all threads");
    }

    //创建一个FixedThreadPool对象 总共只有5个线程
//        ExecutorService executor = Executors.newFixedThreadPool(5);
}
package com.how2java.tmall.train.ThreadPool;

import java.util.Date;

/**
 * 线程执行
 * @Author: yslu
 * @Date: 2019-09-30 8:43
 * @description:
 */
public class WorkerThread implements Runnable {

    private String command;

    public WorkerThread(String s) {
        this.command = s;
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " Start. Time = " + new Date());
        processCommand();
        System.out.println(Thread.currentThread().getName() + " End. Time = " + new Date());
    }

    private void processCommand() {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public String toString() {
        return this.command;
    }
}

原文地址:https://www.cnblogs.com/yslu/p/11629396.html

时间: 2024-08-01 03:14:43

线程池基础的相关文章

Java(Android)线程池---基础篇

1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 newThread(newRunnable(){ 2 3 @Override 4 publicvoidrun(){ 5 // TODO Auto-generated method stub 6 } 7 }).start(); 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差.b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致

Java:线程池基础

基本认识 以下摘自百度百科 线程池的概念:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务. 线程池的作用:在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁.如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资

c# 多线程线程池基础

线程池的作用        在上一篇中我们了解了创建和销毁线程是一个昂贵的操作,要耗费大量的时间,太多的线程会浪费内存资源,当线程数量操作计算机CPU的数量后操作系统必须调度可运行的线程并执行上下文切换,所有太多的线程还会影响性能,那么有没有办法让线程可以重复使用了,让线程干完活之后不用销毁,把它放在一个容器中, 等待下次有任务的时候在从容器中取出来就行了,这样就避免了创建和销毁所带来的性能损耗,所有线程池的作用总结起来就是:因为创建一个线程的代价较高,因此我们使用线程池设法复用线程. 线程基础

delphi 线程池基础 TSimplePool

1. TSimpleThread 2. TSimpleList 3. 以1,2构成 TSimplePool 用法 先定义: TDoSomeThingThread=class(TSimpleThread) ; 并给 TDoSomeThingThread reintroduce Create 不带参数的构造函数. 再定义  TDoSomeThingPool=class(TSimpleTool<TDoSomeThing>); 最后,只需在 TDoSomeThingPool 写线程调度的代码就行了,可

并发编程—7.2线程池基础

目录 1.什么是线程池?为什么要用线程池? 2.实现一个我们自己的线程池 3.JDK中的线程池和工作机制 3.1 线程池的创建 3.2 提交任务 3.3 关闭线程池 3.4 工作机制 4.合理配置线程池 5.预定义的线程池 6.Executor框架 7.了解CompletionService 1.什么是线程池?为什么要用线程池? 降低资源的消耗.线程的创建和销毁 提高响应速度.线程的创建时间为T1,执行时间T2,销毁时间T3,免去T1和T3的时间 提高线程的可管理性. 2.实现一个我们自己的线程

线程池基础篇

一.什么是线程池?为什么要用线程池? 1. 降低资源的消耗.降低线程创建和销毁的资源消耗: 2. 提高响应速度:线程的创建时间为T1,执行时间T2,销毁时间T3,免去T1和T3的时间 3. 提高线程的可管理性. 二.线程池的创建 ThreadPoolExecutor,jdk所有线程池实现的父类 三.参数介绍 先看构造函数: /** * Creates a new {@code ThreadPoolExecutor} with the given initial * parameters. * *

Java线程池-基础

线程池的核心类:ThreadPoolExecutor ,类图如下: (I:代表接口,C:代表实现类) I:Executor I:ExecutorService C:AbstractExecutorService C:ThreadPoolExecutor 构造函数: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Run

记5.28大促压测的性能优化&mdash;线程池相关问题

目录: 1.环境介绍 2.症状 3.诊断 4.结论 5.解决 6.对比java实现 废话就不多说了,本文分享下博主在5.28大促压测期间解决的一个性能问题,觉得这个还是比较有意思的,值得总结拿出来分享下. 博主所服务的部门是作为公共业务平台,公共业务平台支持上层所有业务系统(2C.UGC.直播等).平台中核心之一的就是订单域相关服务,下单服务.查单服务.支付回调服务,当然结算页暂时还是我们负责,结算页负责承上启下进行下单.结算.跳支付中心.每次业务方进行大促期间平台都要进行一次常规压测,做到心里

记5.28大促压测的性能优化—线程池相关问题

目录: 1.环境介绍 2.症状 3.诊断 4.结论 5.解决 6.对比java实现 废话就不多说了,本文分享下博主在5.28大促压测期间解决的一个性能问题,觉得这个还是比较有意思的,值得总结拿出来分享下. 博主所服务的部门是作为公共业务平台,公共业务平台支持上层所有业务系统(2C.UGC.直播等).平台中核心之一的就是订单域相关服务,下单服务.查单服务.支付回调服务,当然结算页暂时还是我们负责,结算页负责承上启下进行下单.结算.跳支付中心.每次业务方进行大促期间平台都要进行一次常规压测,做到心里