首页 > 编程语言 >Java多线程

Java多线程

时间:2023-11-03 21:32:41浏览次数:33  
标签:ExecutorService Java Executors int 创建 队列 线程 多线程

构造方法

//参数最全的构造方法
public ThreadPoolExecutor(int corePoolSize,//核心线程数
                          int maximumPoolSize,//最大线程数
                          long keepAliveTime,//非核心线程最长等待新任务的时间
                          TimeUnit unit,//时间单位
                          BlockingQueue<Runnable> workQueue,//线程池的任务队列(阻塞队列),
                          ThreadFactory threadFactory,//线程工厂--线程创建的方案
                          RejectedExecutionHandler handler//拒绝策略--描述了当线程池任务队列满了, 如果继续添加任务会以什么样的方式处理
                         ){}

// 其他的构造方法
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue){}

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory) {}

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          RejectedExecutionHandler handler){}

拒绝策略

修饰符类型

拒绝策略类型

拒绝策略描述

static class

ThreadPoolExecutor.AbortPolicy

如果任务太多, 队列满了, 直接抛出异常RejectedExecutionException(拒绝执行异常)

static class

ThreadPoolExecutor.CallerRunsPolicy

如果任务太多, 队列满了, 多出来的任务, 谁加的, 谁负责执行

static class

ThreadPoolExecutor.DiscardOldestPolicy

如果任务太多, 队列满了, 丢弃最旧的未处理的任务

static class

ThreadPoolExecutor.DiscardPolicy

如果任务太多, 队列满了, 丢弃多出来的任务

创建线程池Demo

package com.qlx.thread;
import java.util.concurrent.*;
/**
 * @Description ThreadPoolStudy
 * @Author Timing
 * @Date 2023/11/03 14:40
 */
public class ThreadPoolStudy {
  public static void main(String[] args) {
    //创建一个固定数量的线程池
    // 1. 创建一个操作无界队列且固定大小线程池
    ExecutorService pool1 = Executors.newFixedThreadPool(10);

    //线程池中线程的数量是动态变化的
    // 2. 用来处理大量短时间工作任务的线程池,如果池中没有可用的线程将创建新的线程,如果线程空闲60秒将收回并移出缓存
    ExecutorService pool2 = Executors.newCachedThreadPool();

    //线程池中只有一个线程
    // 3. 创建一个操作无界队列且只有一个工作线程的线程池
    ExecutorService pool3 = Executors.newSingleThreadExecutor();

    //线程池中只有一个线程+定时器功能
    // 4. 创建一个单线程执行器,可以在给定时间后执行或定期执行。
    ExecutorService pool4 = Executors.newSingleThreadScheduledExecutor(Executors.defaultThreadFactory());

    //创建一个固定数量的线程池+定时器功能
    // 5. 创建一个指定大小的线程池,可以在给定时间后执行或定期执行。
    ExecutorService pool5 = Executors.newScheduledThreadPool(3, Executors.defaultThreadFactory());

    // 6. 创建一个指定大小(不传入参数,为当前机器CPU核心数)的线程池,并行地处理任务,不保证处理顺序
    ExecutorService pool6 = Executors.newWorkStealingPool();

    // 7. 自定义线程池
    ExecutorService pool7 = new ThreadPoolExecutor(3, 10, 10000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
  }
}

上面代码中前6种创建方式, 都是使用Executors(线程池的工具类)调用一个方法返回一个对象来创建线程池对象, 与第7种直接new对象的方式不同, 通过前6种方式创建出来的线程池, 本质上也是通过包装ThreadPoolExecutor来实现出来的

标签:ExecutorService,Java,Executors,int,创建,队列,线程,多线程
From: https://blog.51cto.com/u_15978361/8174454

相关文章

  • 一道入门的java安全题
    【XCTF】Zhuanxv收获java题的一般流程HQL注入SQL注入看题目录扫描dirsearch扫目录,发现list目录:一个登录界面,本着尽量不写sql注入题目的原则(因为太菜了这方面,抓包查看代码:js代码中为了加载图片直接写出了后台存储图像路径,那试试能不能通过这个url和参数直接读......
  • 2D物理引擎 Box2D for javascript Games 第七章 子弹和感应器
    2D物理引擎Box2DforjavascriptGames第七章子弹和感应器你知道Box2D可以在每一个时间步中管理刚体间的碰撞并决算它们。总之,在愤怒的小鸟中制作攻城机器期间,发生了一些错误你可能需要注意一下,有时抛射物会穿过城堡,忽略了碰撞。这里发生了什么?通常,Javascript游戏运行......
  • Java拾贝第十五天——集合之Map
    从上图中可以发现,Map接口与Collection接口是不同的。Map接口中的每个元素都使用"键值对"的形式存储在集合中。(key→value)其接口定义如下:publicinterfaceMap<K,V>K泛型代表的是key,V泛型代表的是value。在使用Map时必须指定两个具体的类型。Map常见的实现子类:HashMap,TreeM......
  • JavaScript 其他循环语句和跳转语句
    一、while语句While循环会在指定条件为真时循环执行代码块。While循环,先进行条件判断,再执行循环体的代码while(条件表达式){循环体}如果条件不满足,则不会执行循环体,一次都不会案例:vari=1;while(i<=10){console.log(i);i++;}二、do.....while循环do/while......
  • 01-02异步多线程基础概念
    任何异步多线程都离不开委托delegate--lambda-action/Func委托的异步调用异步多线程:发起调用,不等待结束就直接进入下一行(主线程)动作会有新的线程执行.线程特点特点一:多线程和界面使用(说白了,多线程就是为了给大量计算创建子线程,然后先执行完后面代码)场......
  • 使用Docker部署java项目时遇到的几个错误
    0.简介本文主要是在学习黑马程序员Docker快速入门到项目部署过程中,对遇到的问题进行了相关的总结梳理1.本地已存在mysql服务占用3306端口问题当我使用dockerrun-d--namemysql-p3306:3306-eTZ=Asia/Shanghai-eMYSQL_ROOT_PASSWORD=123mysql准备创建mysql容器时报......
  • 如何获取URL参数使用jQuery或纯JavaScript?
    内容来自DOChttps://q.houxu6.top/?s=如何获取URL参数使用jQuery或纯JavaScript?我看过很多jQuery示例,其中参数的大小和名称是未知的。我的URL只会有一个字符串:http://example.com?sent=yes我只想检测:sent是否存在?它是否等于"yes"?最佳解决方案这里。vargetUrlPar......
  • Java八股面试整理(3)
    21.说一说hashCode()和equals()的关系hashCode()用于获取哈希码(散列码),eauqls()用于比较两个对象是否相等,它们应遵守如下规定:如果两个对象相等,则它们必须有相同的哈希码。如果两个对象有相同的哈希码,则它们未必相等。22.为什么要重写hashCode()和equals()?Object类提供的equ......
  • java判断按键是否按下
    Java判断按键是否按下的实现1.简介在Java中,可以使用java.awt.event.KeyEvent类来判断按键是否按下。本文将为刚入行的小白介绍如何实现Java判断按键是否按下的方法。2.实现步骤以下是实现Java判断按键是否按下的步骤:步骤 描述步骤1 创建一个KeyListener对象步骤2 实现KeyList......
  • java获得之前的时间, 时间的减法运算实现
    //方法一SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");StringmaxDateStr="2018-01-01";StringminDateStr="";Calendarcalc=Calendar.getInstance();try{......