微服务 第一章 Java线程池技术应用

这篇具有很好参考价值的文章主要介绍了微服务 第一章 Java线程池技术应用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

系列文章目录

第一章 Java线程池技术应用

微服务 第一章 Java线程池技术应用,面试,Java微服务,微服务,java,python,原力计划


前言

介绍Java的线程、线程池等操作

1、Java创建线程方式回顾

1.1、继承Thread类(只运行一次)

public class ThreadTest extends Thread{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        new ThreadTest().start();
    }
}

1.1.1、改造成主线程常驻,每秒开启新线程运行


import java.util.Date;

@Slf4j
public class ThreadTest extends  Thread{

    @Override
    public void run() {
        log.info("线程名称:{} , 当前时间:{}" , Thread.currentThread().getName() , new Date().getTime() );
    }

    public static void main(String[] args) {

        while (true) {
            try {
                new ThreadTest().start();
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            log.info("主线程常驻");
        }
    }

}

1.1.2、匿名内部类

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ThreadTest extends  Thread{

    public static void main(String[] args) {

        Thread thread = new Thread() {
            @Override
            public void run() {
                log.info("Hello {}" , "world");
            }
        };

        thread.start();
    }

}

1.1.3、缺点

继承了Thread类之后,就不能继承其他类

1.1.4、扩展知识:Java内部类

成员内部类(外部类内部使用,外部类外部使用)


import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Outer {
    public static void main(String[] args) {
        Inner inner = new Outer().initTest();
        log.info(inner.innerTest());
    }

    public Inner initTest(){
        Inner inner = new Inner();
        return  inner;
    }

    class Inner{
        public Inner(){

        }
        public Inner(String s){

        }

        public String innerTest(){
            return "Inner Hello world";
        }
    }
}

1.1.4.1、静态内部类
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Outer {
    public static void main(String[] args) {
        Inner inner = new Inner();
        log.info(inner.innerTest());
    }

    public void initTest(){
        Inner inner = new Inner();
    }

    static class Inner{
        public Inner(){

        }
        public Inner(String s){

        }
        public String innerTest(){
            return "Inner Hello world";
        }
    }
}
1.1.4.2、匿名内部类
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Outer {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.sayHello();

    }
    public void sayHello(){
        IMessage iMessage = new IMessage() {
            //匿名类
            @Override
            public String sayHello() {
                return "Hello world";
            }
        };
        log.info(iMessage.sayHello());

    }

    interface IMessage{
        String sayHello();
    }

}

1.2、实现Runnable接口

1.2.1、普通类实现Runnable接口

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class StatSales implements Runnable{
    @Override
    public void run() {
        log.info("统计销量");
    }

    public static void main(String[] args) {
        Thread thread = new Thread() {
            @Override
            public void run() {
                log.info("Hello world");
            }
        };
        thread.start();
    }
}

1.2.2、匿名方式创建Runnable实现类

public static void main(String[] args) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("统计成绩");
            }
        };
        new Thread(runnable).start();
    }

1.2.3、使用Lambda方式创建匿名Runnable类

// 使用 Lambda 匿名 Runnable 方式
Thread t3 = new Thread(() -> {
//添加业务方法…
});
// 启动线程
t3.start();

public static void main(String[] args) {
    Thread thread = new Thread(() -> {
        System.out.println("统计平均寿命");
    });

    thread.start();
}

1.2.4、缺点

不能获得程序的执行结果

1.2.5、扩展Lambda表达式

把函数作为一个方法的参数
表达式语法:

(parameters) -> expression

(parameters) ->{ statements; }

说明:

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
  • 举例:

    // 1. 不需要参数,返回值为 5  
    () -> 5  
      
    // 2. 接收一个参数(数字类型),返回其2倍的值  
    x -> 2 * x  
      
    // 3. 接受2个参数(数字),并返回他们的差值  
    (x, y) -> x – y  
      
    // 4. 接收2个int型整数,返回他们的和  
    (int x, int y) -> x + y  
      
    // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
    (String s) -> System.out.print(s)
    

    1.3、实现Callable接口

    FutureTask+Callable

    1.3.1、普通类实现Callable接口

    public class StatScore implements Callable<Double> {
        @Override
        public Double call() throws Exception {
            //统计分数的逻辑
            return 88.98;
        }
    }
    
     public static void main(String[] args) throws ExecutionException, InterruptedException {
            StatScore statScore = new StatScore();
            //跟FutureTask 关联上
            FutureTask<Double> doubleFutureTask = new FutureTask<>(statScore);
            //跟Thread关联上
            Thread thread = new Thread(doubleFutureTask);
            thread.start();
            log.info(String.valueOf(doubleFutureTask.get()));
        }
    

    2、线程池

    线程池就是存放线程的池子,池子里存放了很多可以复用的线程。
    使用线程池的优势

  • 提高效率,创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。
  • 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
  • 提升系统响应速度,假如创建线程用的时间为T1,执行任务用的时间为T2,销毁线程用的时间为T3,那么使用线程池就免去了T1和T3的时间;
  • 微服务 第一章 Java线程池技术应用,面试,Java微服务,微服务,java,python,原力计划

    2.1、五种创建线程的方式

    //创建一个单线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行
    ExecutorService executorService = Executors.newSingleThreadExecutor();
    //创建一个定长的线程池,可控制最大并发数,超出的线程进行队列等待。 ExecutorService executorService =
    Executors.newFixedThreadPool(2); //可以创建定长的、支持定时任务,周期任务执行。
    ExecutorService executorService = Executors.newScheduledThreadPool(2);
    //创建一个可以缓存的线程池,如果线程池长度超过处理需要,可以灵活回收空闲线程,没回收的话就新建线程 ExecutorService
    executorService = Executors.newCachedThreadPool(); //创建一个具有抢占式操作的线程池
    ExecutorService executorService = Executors.newWorkStealingPool();

    2.2、new ThreadPoolExecutor()创建线程

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

    参数说明:

    参数 含义 解释
    corePoolSize 该线程池中核心线程数最大值 核心线程生命周期无限,即使空闲也不会死亡
    maximumPoolSize 线程总数最大值 任务队列满了以后当有新任务进来则会增加一个线程来处理新任务(线程总数<maximumPoolSize )
    keepAliveTime 闲置超时时间 当线程数大于核心线程数时,超过keepAliveTime时间将会回收非核心线程
    unit keepAliveTime 的单位
    workQueue 线程池中的任务队列 *
    threadFactory 为线程池提供创建新线程的线程工厂 *
    RejectedExecutionHandler 饱和策略 抛出异常专用,当队列和最大线程池都满了之后的饱和策略。

    微服务 第一章 Java线程池技术应用,面试,Java微服务,微服务,java,python,原力计划

    2.2.1、拒绝策略

    ThreadPoolExecutor的饱和策略可以通过调用setRejectedExecutionHandler来修改。JDK提供了几种不同的RejectedExecutionHandler实现,每种实现都包含有不同的饱和策略:AbortPolicy、CallerRunsPolicy、DiscardPolicy和DiscardOldestPolicy。

    拒绝策略如下:

  • CallerRunsPolicy : 调用线程处理任务
  • AbortPolicy : 抛出异常
  • DiscardPolicy : 直接丢弃
  • DiscardOldestPolicy : 丢弃队列中最老的任务,执行新任务
  •         RejectedExecutionHandler rejected = null;
    
            //默认策略,阻塞队列满,则丢任务、抛出异常
            rejected = new ThreadPoolExecutor.AbortPolicy();
    
            //阻塞队列满,则丢任务,不抛异常
            rejected = new ThreadPoolExecutor.DiscardPolicy();
    
            //删除队列中最旧的任务(最早进入队列的任务),尝试重新提交新的任务
            rejected = new ThreadPoolExecutor.DiscardOldestPolicy();
    
            //队列满,不丢任务,不抛异常,若添加到线程池失败,那么主线程会自己去执行该任务
            rejected = new ThreadPoolExecutor.CallerRunsPolicy();
            
    

    总结: 就是被拒绝的任务,直接在主线程中运行,不再进入线程池。文章来源地址https://www.toymoban.com/news/detail-721371.html

到了这里,关于微服务 第一章 Java线程池技术应用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第一套智能合约安全漏洞测试(0基础版)

    第一套题的智能合约安全漏洞测试题目 漏洞合约代码 总结: EtherStore合约 是一个简单的储蓄合约,用户可以存入和提取以太币。 Attack合约 是针对 EtherStore 合约设计的,它包含了一个构造函数来引用目标 EtherStore 合约 ,并提供了一个 attack 函数 ,试图通过先存入再立即提取

    2024年04月11日
    浏览(51)
  • 微服务技术栈-Docker应用部署

    之前文章讲到过,docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器,接下来我们将介绍如何使用docker去部署Java web开发的常见服务。 在之前的文章中我们介绍了容器之间使用沙箱机制,相互隔离。现在我们继续来思考几个Docker容器在

    2024年02月07日
    浏览(37)
  • 云计算技术应用实训OpenStack认证服务

    #只在controller上执行 #1.安装和配置 #先决条件 #(1)用数据库连接客户端以 root 用户连接到数据库服务器 #(2)创建 keystone 数据库:   #(3)对``keystone``数据库授予恰当的权限 #(4)验证  show databases; #可以看到keystone库已创建 #(5)退出 #2.安全并配置组件 #(1)安装包 #(2)编辑文件 /etc/keyst

    2024年02月06日
    浏览(37)
  • 第一章 Linux系统服务:Apache安装及配置应用

    1.1http与html 1.2浏览器访问网站的过程 1.3HTTP工作机制 1.4版本 1.5HTTP方法 1.6.http状态码 1.7请求报文 1.8 响应报文 1.Apache基础知识 2.Apache配置文件位置 1.LAMP平台概述 2.LAMP各组件主要作用 3.构建LAMP平台顺序 1. prefork模式(默认模式) 2. worker模式 3. event模式 1.1http与html HTTP:为解决

    2024年02月02日
    浏览(44)
  • gps北斗授时服务器(NTP时钟服务器)技术应用方案

    gps北斗授时服务器(NTP时钟服务器)技术应用方案 gps北斗授时服务器(NTP时钟服务器)技术应用方案 京准电子科技官微——ahjzsz 随着计算机和网络通信技术的飞速发展,火电厂热工自动化系统数字化、网络化的时代已经到来。一方面它为控制和信息系统之间的数据交换、分

    2024年02月08日
    浏览(60)
  • 服务器防火墙的应用技术有哪些?

           随着互联网的发展,网络安全问题更加严峻。服务器防火墙技术作为一种基础的网络安全技术,对于保障我们的网络安全至关重要。本文将介绍服务器防火墙的概念和作用,以及主要的服务器防火墙技术,包括数据包过滤、状态检测、代理服务、应用层网关等,帮助

    2024年02月21日
    浏览(40)
  • 和数集团Baas服务如何推动区块链技术应用和产业发展?

    近日,《区块链和分布式记账技术 参考架构》(GB/T 42752-2023)国家标准正式发布。这是我国首个获批发布的区块链技术领域国家标准。该标准在区块链技术应用和产业发展方面提出了参考架构规范,包括用户视图、功能视图、实现视图和部署视图。在功能架构方面,包含用户层

    2024年02月15日
    浏览(38)
  • Java并发编程详解:实现高效并发应用的关键技术

    在当前的计算机领域,高效的并发编程对于Java开发人员而言变得越发重要。作为流行的编程语言,Java提供了强大的并发编程支持,使开发人员能够充分发挥多核处理器和线程的潜力,构建高性能、高吞吐量的应用程序。本文将深入探讨Java并发编程的关键技术,包括线程安全

    2024年02月13日
    浏览(50)
  • 开源软件安全与应对策略探讨 - Java 机密计算技术应用实践

    据统计,90% 以上的应用都在使用第三方软件库,这些软件大部分都是开源的。与此同时,有超过一半的全球 500 强公司都在使用存在漏洞的开源软件。这幅漫画生动的描述了一个大型应用软件的组件架构,它可能建立在一个极其脆弱的开源组件基础之上,这个组件可能是二十

    2024年01月22日
    浏览(58)
  • 技术应用:Java中eq、ne、ge、gt、le、lt的含义及实际应用

    引言 在Java编程中,我们经常会遇到需要进行比较操作的场景。为了满足不同的需求,Java提供了一系列比较运算符,如eq、ne、ge、gt、le、lt等。本文将介绍这些运算符的含义,并结合使用MyBatis Plus框架的示例代码,说明它们的实际应用。 eq、ne、ge、gt、le、lt的含义 eq :等于

    2024年04月22日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包