多线程实现的方式

2023-10-26

1、继承Thread类

通过继承Thread类,并重写run方法

public class MyThread extends Thread{

    public static void main(String[] args) {

        MyThread myThread1=new MyThread();
        MyThread myThread2=new MyThread();
        myThread1.start();
        myThread2.start();
    }

    @Override
    public void run() {
        super.run();
        System.out.println("MyThread.run()");
    }
}
2、实现Runnable接口

实现Runnable接口,并重写run方法

public class MyThread1 implements Runnable{
    public static void main(String[] args) {
        MyThread1 myThread1=new MyThread1();
        Thread thread=new Thread(myThread1);
        thread.start();
    }
    @Override
    public void run() {

        System.out.println("创建多线程--->实现Runnable接口");
    }
}
3、实现Callable接口

实现Callable接口,并重写call方法
1、Callable接口有返回值,通过FutureTask可以获取返回值
2、与Runnable接口相比,Callable接口可以抛出异常

public class Mythread2  {

    private static Integer Integer;

    public static void main(String[] args)  {

        //1.实例化一个CallableTest对象
        CallableTest callableTest=new CallableTest();
        //2.实现Callable接口,需要FutureTask实现类的支持,用于接受运算结果
        FutureTask futureTask=new FutureTask(callableTest);
        //3.将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start()
        new Thread(futureTask).start();

        try {
            //4.通过get方法获取结果
            Object sum = futureTask.get();
            System.out.println("0到100偶数的总和为:"+sum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }


    static class CallableTest implements Callable {

        @Override
        public Integer call() throws Exception {
            int sum=0;
            for (int i=0;i<=100;i++){
                if (i%2==0){
                    sum+=i;
                }
            }
            return sum;
        }
    }

}
4、通过线程池的方式实现多线程

java中ThreadPoolExecutor实现多线程的方法

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }
参数说明
corePoolSize

核心线程数,核心线程池的大小,当一个任务提交到线程池的时候,核心线程池会创建一个核心线程来执行任务

  • 核心线程数会一直存活,即便没有任务需要执行的情况
  • 当线程数小于核心线程数时,即便有线程空闲,线程池也会创建新线程处理
  • 设置allowsCoreThreadTimeOut=true(默认false)时,核心线程会超时关闭
maximumPoolSize

最大线程数

  • 当线程数>=corePoolSize,且任务队列已满时,线程池会创建新线程来处理任务
  • 当线程数=maximumPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常
keepAliveTime

线程空闲时间

  • 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
  • 如果allowsCoreThreadTimeOut=true,则会知道线程数量=0
TimeUnit

时间单位

BlockingQueue

任务队列

  • 核心线程数达到最大时,新任务会放在队列中排队进行等待
RejectedExecutionHandler

拒绝策略,当线程池的队列已经满了的情况下。新进入的任务添加到线程池的时候就会进行处理,JDk默认有四种任务拒绝策略

  • AbortPolicy(默认): 默认的拒绝策略,会直接抛出RejectedExecutionException异常
  • DiscardPolicy: 当新任务被提交后直接被丢弃
  • DiscardOldestPolicy: 当新任务添加进线程池的时候,会放弃任务队列中的头节点,此时丢弃的是队列中存活时间最长的队列
  • CallerRunsPolicy: 该策略既不会抛弃任务,也不会抛出异常,而是将任务回推到调用者。"顾名思义,在饱和的情况下,调用者会执行该任务
  • 用户自定义拒绝策略: 实现RejectedExecutionHandler,并自己定义策略模式
线程池的执行原理
  • 工作流程图如下
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmNeVeUm-1654780005042)(https://gitee.com/ycodingnow/blogimage/raw/master/image/20220609112305.png#pic_center)]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程实现的方式 的相关文章

随机推荐

  • python可使用什么退出死循环_碰到python死循环后要怎么退出结束?

    每当编写代码行云流水 却突然碰到代码无限循环 这是非常让人头疼的 难道直接退出程序运行嘛 答案肯定是不行 怎么跳出呢 一起来看下吧 案例 遇到的问题是这样的 如果我定义了一个死循环线程我该如何终止它 我发现用全局变量的方法根本不好使 pys
  • python基础 - networkx 绘图总结

    目录 1 创建方式 2 基本参数 3 DiGraph 有向图 4 Graph 无向图 5 有向图和无向图互转 6 一些精美的图例子 networkx是一个用Python语言开发的图论与复杂网络建模工具 内置了常用的图与复杂网络分析算法 可以
  • 【科普向】LaTeX简介(一篇极简的 LaTeX 介绍文章)

    文章目录 LaTeX诞生背景 TeX和LaTeX LaTeX主要功能 文档结构 数学公式 公式块 我们平时在word里新建一个doc x 文件后 输入内容 调整页边距 字体大小 行间距等待 然后交给打印机打印就可以了 如果你写了一篇关于新疆
  • Qt获取控件位置,坐标总结

    总结的结果是 QMouseEvent中两类坐标系统 一类是窗口坐标 一类是显示器坐标 总结一 经过试验 QMouseEvent globalPos 和 QCursor pos 效果一样 但是Qt帮助文档说不一样 可是我获得值确实相同的 QC
  • 手把手搭建Python量化交易平台-2:量化策略的原理与整体架构

    摘要 探讨量化策略的整体架构 一 量化策略的原理与整体架构 1 输入数据 来自于金融数据共享平台 1 行情或技术面数据 K线数据 MA均线数据 MACD数据 2 财务或基本面数据 国家宏观经济 行业经济 公司财务数据 3 自定义数据 4 投
  • 看懂今天这个!你就是个真正的javaer!

    昨天 猿人君已经教会你搞对象了 听说 由于文字篇幅有限 讲得不明白的地方 大家关注公主号猿人工厂 或者加入qq群765605694 猿人工厂君 手把手的免费教你 恭喜你 从此开始一段新的人生 跨越上和大海 抽象人山人海 在过去的几天里 你已
  • 单词统计

    题目描述 输入一行字符 统计其中有多少个单词 单词之间以空格分隔 输入 一行英文字符 含空格 输出 单词的个数 单独占一行 样例输入 I am a boy 样例输出 4 代码 Java版 import java util Scanner p
  • 毕业后的五年拉开大家差距的原因在哪里?

    有人工作 有人继续上学 大家千万不要错过这篇文章 能看到这篇文章也是一种幸运 真的受益匪浅 对我有很大启迪 这篇文章将会改变我的一生 真的太好了 希望与有缘人分享 也希望对有缘人有所帮助 看完之后有种 相见恨晚 的感觉 特别激动 希望大家好
  • Eclipse环境下通过Cygwin使用NDK编译jni程序

    一 认识Cygwin NDK和jni 首先来认识一下什么是Cygwin NDK和jni Cygwin Cygwin是一个在windows平台上运行的unix模拟环境 它对于学习unix linux操作环境 或者从unix到windows的应
  • java 动态生成 visio----aspose.diagram for java

    最近在鼓捣java 如何生成visio图表 苦于没有API 找到了aspose这个神器 下载试用版本之后 发现最多只能生成10个元素 而且有水印 下面尝试如何去掉水印与元素限制 本文章所涉及的软件均可从网上获取 但是只能用于学习之用 不能用
  • idea使用http客户端上传文件

    controller 文件上传 param file return PostMapping value fileUpload ResponseBody public String uploadSkuImage RequestParam fi
  • 初始C语言——从大到小排序

    三个数的排序 三个数之间两两比较类似于三个数中显示最大值 两两比较 但是有一个问题 最大值问题只需要输出最大值即可而排序问题则还要排序 那么我们是否可以确定三个位置x y z将最大值依次赋值给x y z确保输出时x y z的位置是从左到右输
  • 真二次元!动漫形象风格迁移

    点击上方 机器学习与生成对抗网络 关注星标 获取有趣 好玩的前沿干货 文章 机器之心 一张输入人脸图像 竟能生成多样化风格的动漫形象 伊利诺伊大学香槟分校的研究者做到了 他们提出的全新 GAN 迁移方法实现了 一对多 的生成效果 在 GAN
  • 【JVM】JVM-codecache内存区域介绍

    1 概述 转载 https leokongwq github io 2016 10 12 maven test html 2 JVM codecache内存区域介绍 大家都知道JVM在运行时会将频繁调用方法的字节码编译为本地机器码 这部分代
  • 网络层_数据平面_四(题目完成)

    网络 引入网络层学习 分组交换 虚电路VC 数据报网络 CIDR DHCP 路由器 IP数据报格式 IPv4 IPv6 过渡策略 双栈 隧道 特殊IP地址即内部IP地址 流表中匹配 动作 计算机自顶向下方法 第七版课后习题及答案 正在更新中
  • 论文解读:Investigating the Factual Knowledge Boundary of Large Language Models with Retrieval Augmentati

    论文解读 Investigating the Factual Knowledge Boundary of Large Language Models with Retrieval Augmentation 一 动机 Knowledge in
  • C++ 智能指针我得用用看

    文章目录 0 前言 0 1 使用智能指针的原因 0 2 智能指针和普通指针的区别 什么是智能指针 1 auto ptr 1 1 基本说明 1 2 例子 chestnut 1 3 使用建议 3 unique ptr 3 1 实现原理 3 2
  • [游戏开发]网络同步方式

    状态同步 优点 数据在服务器运算 客户端接收到的数据一定准确 防止数据作弊 角色数据在服务器 客户端只上传操作 想作弊没门 网络波动不敏感 多端表现可以不一致 重视数值准确 缺点 前后端数据包体大 服务器压力比较重 计算量 传输量 研发特点
  • java中冒号(:)的用法

    java中冒号的用法大概可以分为四种 用在for循环中 用来遍历数组 集合 中的元素 for x nums print x 用在三目运算符中 表达式 执行语句1 执行语句2 这里的冒号是用来根据前面表达式的值正确与否 选择后面对应执行语句的
  • 多线程实现的方式

    1 继承Thread类 通过继承Thread类 并重写run方法 public class MyThread extends Thread public static void main String args MyThread myThr