iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java中的异步与线程池怎么创建使用
  • 315
分享到

Java中的异步与线程池怎么创建使用

2023-07-04 15:07:42 315人浏览 八月长安
摘要

这篇文章主要介绍“Java中的异步与线程池怎么创建使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中的异步与线程池怎么创建使用”文章能帮助大家解决问题。初始化线程的4种方式1.继承Thre

这篇文章主要介绍“Java中的异步与线程池怎么创建使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中的异步与线程池怎么创建使用”文章能帮助大家解决问题。

    初始化线程的4种方式

    1.继承Thread

    Thread01 thread01 = new Thread01();thread01.start();    public static  class Thread01 extends Thread{        @Override        public void run() {            System.out.println("当前线程:"+Thread.currentThread().getId());            int i = 10 / 2;            System.out.println("运行结果:"+i);        }    }

    2.实现Runnable 接口

    Runnable01 runnable01 = new Runnable01();    new Thread(runnable01).start();    public static class Runnable01 implements Runnable{        @Override        public void run() {            System.out.println("当前线程:"+Thread.currentThread().getId());            int i = 10 / 2;            System.out.println("运行结果:"+i);        }    }

    3.实现Callable 接口+ FutureTask (可以拿到返回结果,可以处理异常)

        Callabel01 callabel01 = new Callabel01();    FutureTask<Integer> integerFutureTask = new FutureTask<>(callabel01);    //阻塞等待整个线程执行完成,获取返回结果    Integer integer = integerFutureTask.get();    new Thread(integerFutureTask).start();    public static class Callabel01 implements Callable<Integer> {        @Override        public Integer call() throws Exception {            System.out.println("当前线程:"+Thread.currentThread().getId());            int i = 10 / 2;            System.out.println("运行结果:"+i);            return i;        }    }

    在业务代码里面不建议使用以上三种启动线程的方式 

    4.线程池

    应该将所有的多线程异步任务都交给线程池执行,进行有效的资源控制

    //当前系统中池只有一两个,每一个异步任务直接提交给线程池,让他自己去执行ExecutorService service = Executors.newFixedThreadPool(10);//执行service.execute(new Runnable01());

    区别

    1/2两种方式都不能获取返回值

    1/2/3都不能达到资源控制的效果

    只有4能控制资源,系统性能是稳定的

    创建线程池(ExecutorService)

    1.Executors 工具类创建

    //当前系统中池只有一两个,每一个异步任务直接提交给线程池,让他自己去执行ExecutorService service = Executors.newFixedThreadPool(10);//执行service.execute(new Runnable01());

    2.原生方法创建线程池

    ThreadPoolExecutor需要传入七大参数

    • corePoolSize 核心线程数【一直存在,除非设置了允许线程超时的设置:allowCoreThreadTimeOut】,保留在池中的线程数,线程池创建后好后就准备就绪的线程数,就等待异步任务去执行,new 好了 Thread,等待异步任务

    • maximumPoolSize 池中最大线程数量,控制资源并发

    • keepAliveTime 存活时间,当前正在运行的线程数量,大于核心线程数,就会释放空闲的线程,只要线程空闲大于指定存活时间,释放的线程是指最大的线程数量减去核心线程数,

    • unit 时间单位

    • BlockingQueue workQueue 阻塞队列,如果任务有很多,就会将目前多的队伍放在队列里面,只要有空闲的线程,就会去队列里面取出新的任务继续执行。

    • new LinkedBlockingQueue<>() 默认值是Integer的最大值,会导致内存不够,一定要传入业务定制的大小,可以通过压测得出峰值

    • threadFactory 线程的创建工厂

    • handler 如果队列满了,按照我们指定的拒绝策略拒绝执行任务

    3.线程池的运行流程 线程池创建

    准备好core 数量的核心线程,准备接受任务新的任务进来,用core 准备好的空闲线程执行。

    (1) 、core 满了,就将再进来的任务放入阻塞队列中。空闲的core 就会自己去阻塞队列获取任务执行

    (2) 、阻塞队列满了,就直接开新线程执行,最大只能开到max 指定的数量

    (3) 、max 都执行好了。Max-core 数量空闲的线程会在keepAliveTime 指定的时间后自动销毁。最终保持到core 大小

    (4) 、如果线程数开到了max 的数量,还有新任务进来,就会使用reject 指定的拒绝策略进行处理所有的线程创建都是由指定的factory 创建的。

    一个线程池core 7; max 20 ,queue:50,100 并发进来怎么分配的;先有7 个能直接得到执行,接下来50 个进入队列排队,在多开13 个继续执行。

    现在70 个被安排上了。剩下30 个默认拒绝策略。拒绝策略一般是抛弃,如果不想抛弃还要执行,可以使用同步的方式执行,或者丢弃最老的

    Java中的异步与线程池怎么创建使用

    4. 四种常见的线程池

    • newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。核心线程固定是0,所有都可回收

    • newFixedThreadPool创建一个固定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。固定大小,核心 = 最大

    • newScheduledThreadPool创建一个固定长线程池,支持定时及周期性任务执行。定时任务线程池

    • newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。后台从队列里面获取任务 挨个执行

    为什么要使用线程池

    降低资源的消耗

    通过重复利用已经创建好的线程降低线程的创建和销毁带来的损耗

    提高响应速度

    因为线程池中的线程数没有超过线程池的最大上限时,有的线程处于等待分配任务的状态,当任务来时无需创建新的线程就能执行

    提高线程的可管理性

    线程池会根据当前系统特点对池内的线程进行优化处理,减少创建和销毁线程带来的系统开销。无限的创建和销毁线程不仅消耗系统资源,还降低系统的稳定性,使用线程池进行统一分配

    CompletableFuture 异步编排

    业务场景:

    查询商品详情页的逻辑比较复杂,有些数据还需要远程调用,必然需要花费更多的时间

    Java中的异步与线程池怎么创建使用

    假如商品详情页的每个查询,需要如下标注的时间才能完成那么,用户需要5.5s 后才能看到商品详情页的内容。很显然是不能接受的。

    如果有多个线程同时完成这6 步操作,也许只需要1.5s 即可完成响应。

    CompletableFuture 和FutureTask 同属于Future 接口的实现类,都可以获取线程的执行结果。

    Java中的异步与线程池怎么创建使用

    1.创建异步对象

    Java中的异步与线程池怎么创建使用

    runXxxx 都是没有返回结果的,supplyXxx 都是可以获取返回结果的

    可以传入自定义的线程池,否则就用默认的线程池;

    没有返回结果的

    static ExecutorService service = Executors.newFixedThreadPool(10);CompletableFuture.runAsync(()->{     System.out.println("当前线程:"+Thread.currentThread().getId());     int i = 10 / 2;     System.out.println("运行结果:"+i); },service);

    有返回结果的

    static ExecutorService service = Executors.newFixedThreadPool(10);CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> { System.out.println("当前线程:" + Thread.currentThread().getId()); int i = 10 / 2; System.out.println("运行结果:" + i); return i;}, service);Integer integer = future.get();System.out.println("main----end"+integer);

    2.计算完成时(线程执行成功)回调方法

    Java中的异步与线程池怎么创建使用

    whenComplete 可以处理正常和异常的计算结果,虽然可以得到异常信息,但是不能修改返回数据exceptionally 处理异常情况。

    可以感知异常并返回默认值whenComplete 和whenCompleteAsync 的区别:

    • whenComplete:是执行当前任务的线程执行继续执行whenComplete 的任务。

    • whenCompleteAsync:是执行把whenCompleteAsync 这个任务继续提交给线程池来进行执行。

    方法不以Async 结尾,意味着Action 使用相同的线程执行,而Async 可能会使用其他线程执行(如果是使用相同的线程池,也可能会被同一个线程选中执行)

        public static void main(String[] args) throws ExecutionException, InterruptedException {        System.out.println("main----start");        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {            System.out.println("当前线程:" + Thread.currentThread().getId());            int i = 10 / 0;            System.out.println("运行结果:" + i);            return i;        }, service).whenComplete((res,excption)->{            System.out.println("异步任务成功完成:结果是::::"+res+"异常是:"+excption);        }).exceptionally(throwable->{            //可以感知异常,同时返回数据            return 10;        });        Integer integer = future.get();        System.out.println("main----end"+integer);    }

    3.handle 方法(可对结果做最后的处理(可处理异常),可改变返回值)

    Java中的异步与线程池怎么创建使用

    和complete 一样,可对结果做最后的处理(可处理异常),可改变返回值。

                    CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {            System.out.println("当前线程:" + Thread.currentThread().getId());            int i = 10 / 4;            System.out.println("运行结果:" + i);            return i;        }, service).handle((res,exption)->{            if (res != null){                return res*2;            }            if (exption != null){                return 0;            }            return 0;        });

    4.线程串行化

    Java中的异步与线程池怎么创建使用

    • thenApply 方法:当一个线程依赖另一个线程时,获取上一个任务返回的结果,并返回当前任务的返回值。

    • thenAccept 方法:能接收上一步的返回结果,但是不能改变返回值。

    • thenRun 方法:只要上面的任务执行完成,就开始执行thenRun,不能改变返回值带有Async 默认是异步执行的。同之前。

    以上都要前置任务成功完成。

    Function<? super T,? extends U>

    • T:上一个任务返回结果的类型

    • U:当前任务的返回值类型

    • thenRun 方法:只要上面的任务执行完成,就开始执行thenRun,不能改变返回值

    static ExecutorService service = Executors.newFixedThreadPool(10);CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {            System.out.println("当前线程:" + Thread.currentThread().getId());            int i = 10 / 4;            System.out.println("运行结果:" + i);            return i;        }, service).thenRunAsync(() -> {            System.out.println("任务2启动了");        }, service);
    • thenAccept 方法:能接收上一步的返回结果,但是不能改变返回值。

    CompletableFuture<Void> future = CompletableFuture.supplyAsync(() -> {            System.out.println("当前线程:" + Thread.currentThread().getId());            int i = 10 / 4;            System.out.println("运行结果:" + i);            return i;        }, service).thenAccept((res)->{            System.out.println("异步启动了:"+res);        });
    • thenApplyAsync 技能接收上一步的结果,又能改变返回值

     CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {            System.out.println("当前线程:" + Thread.currentThread().getId());            int i = 10 / 4;            System.out.println("运行结果:" + i);            return i;        }, service);        future.thenApplyAsync((res) -> {            System.out.println("任务2启动了:" + res);            return res + "hello";        }, service);        System.out.println("main----end"+future.get());

    5.两任务组合- 都要完成

    Java中的异步与线程池怎么创建使用

    Java中的异步与线程池怎么创建使用

    两个任务必须都完成,触发该任务。

    • thenCombine:组合两个future,获取两个future 的返回结果,并返回当前任务的返回值

    • thenAcceptBoth:组合两个future,获取两个future 任务的返回结果,然后处理任务,没有返回值。

    CompletableFuture<Integer> future01 = CompletableFuture.supplyAsync(() -> {            System.out.println("任务1线程:" + Thread.currentThread().getId());            int i = 10 / 4;            System.out.println("任务1运行结果:" + i);            return i;        }, service);        CompletableFuture<String> future02 = CompletableFuture.supplyAsync(() -> {            System.out.println("任务2线程:" + Thread.currentThread().getId());            System.out.println("任务2运行结果:");            return "hello";        }, service);        future01.thenAcceptBothAsync(future02, (f1, f2) -> {            System.out.println("任务3开始之前的结果---f1=" + f1 + "f2=" + f2);        }, service);
    • runAfterBoth:组合两个future,不获取前两个的结果,只需两个future 处理完任务后,处理该任务。

            CompletableFuture<Integer> future01 = CompletableFuture.supplyAsync(() -> {            System.out.println("任务1线程:" + Thread.currentThread().getId());            int i = 10 / 4;            System.out.println("任务1运行结果:" + i);            return i;        }, service);        CompletableFuture<String> future02 = CompletableFuture.supplyAsync(() -> {            System.out.println("任务2线程:" + Thread.currentThread().getId());            System.out.println("任务2运行结果:");            return "hello";        }, service);        future01.runAfterBothAsync(future02,()->{            System.out.println("任务3开始");        },service);

    6.两任务组合- 一个完成

    Java中的异步与线程池怎么创建使用

    Java中的异步与线程池怎么创建使用

    当两个任务中,任意一个future 任务完成的时候,执行任务。

    • applyToEither:两个任务有一个执行完成,获取它的返回值,处理任务并自己有新的返回值。

            CompletableFuture<Object> future01 = CompletableFuture.supplyAsync(() -> {            System.out.println("任务1线程:" + Thread.currentThread().getId());            int i = 10 / 4;            System.out.println("任务1运行结果:" + i);            return i;        }, service);        CompletableFuture<Object> future02 = CompletableFuture.supplyAsync(() -> {            System.out.println("任务2线程:" + Thread.currentThread().getId());            System.out.println("任务2运行结果:");            return "hello";        }, service);        future01.applyToEitherAsync(future02,(t) -> {            System.out.println("任务3开始"+t);            return t.toString() + "niubi";        }, service);
    • acceptEither:两个任务有一个执行完成,获取它的返回值,处理任务,自己没有新的返回值。

     CompletableFuture<Object> future01 = CompletableFuture.supplyAsync(() -> {            System.out.println("任务1线程:" + Thread.currentThread().getId());            int i = 10 / 4;            System.out.println("任务1运行结果:" + i);            return i;        }, service);        CompletableFuture<Object> future02 = CompletableFuture.supplyAsync(() -> {            System.out.println("任务2线程:" + Thread.currentThread().getId());            System.out.println("任务2运行结果:");            return "hello";        }, service);        future01.acceptEitherAsync(future02,(t) -> {            System.out.println("任务3开始"+t);        }, service);
    • runAfterEither:两个任务有一个执行完成,不获取future 的结果,处理任务,自己也没有返回值。

    CompletableFuture<Integer> future01 = CompletableFuture.supplyAsync(() -> {            System.out.println("任务1线程:" + Thread.currentThread().getId());            int i = 10 / 4;            System.out.println("任务1运行结果:" + i);            return i;        }, service);        CompletableFuture<String> future02 = CompletableFuture.supplyAsync(() -> {            System.out.println("任务2线程:" + Thread.currentThread().getId());            System.out.println("任务2运行结果:");            return "hello";        }, service);        future01.runAfterEitherAsync(future02,() -> {            System.out.println("任务3开始");        }, service);

    7.多任务组合

    Java中的异步与线程池怎么创建使用

    • allOf:等待所有任务完成

    CompletableFuture<String> futureImg = CompletableFuture.supplyAsync(() -> {            System.out.println("查询商品的图片信息");            return "hello.png";        }, service);        CompletableFuture<String> futureAttr = CompletableFuture.supplyAsync(() -> {            System.out.println("查询商品的属性");            return "黑色+256g";        }, service);        CompletableFuture<String> futureDesc = CompletableFuture.supplyAsync(() -> {            System.out.println("查询商品的介绍");            return "华为";        }, service);        CompletableFuture<Void> completableFuture = CompletableFuture.allOf(futureImg, futureAttr, futureDesc);        completableFuture.get(); //等待所有结果完成
    • anyOf:只要有一个任务完成

    整合SpringBoot

    添加配置类,新建线程池

    package cn.cloud.xmall.product.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;@Configurationpublic class MyThreadConfig {    @Bean    public ThreadPoolExecutor threadPoolExecutor(){       return new ThreadPoolExecutor(                20,                200,                10,                TimeUnit.SECONDS,                new LinkedBlockingQueue<>(100000),                Executors.defaultThreadFactory(),                new ThreadPoolExecutor.AbortPolicy()                );    };}

    想要在配置文件中手动的配置参数

    新建一个配置属性类

    package cn.cloud.xmall.product.config;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Configuration;import org.springframework.stereotype.Component;@ConfigurationProperties(prefix = "xmall.thread")@Component  //加入容器@Datapublic class ThreadPollConfigProperties {    private Integer coreSize;    private Integer maxSize;    private Integer keepAliveTime;}

    注:可以在依赖种添加此依赖,在配置文件中就会有我们自己配置属性的提示

    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-configuration-processor</artifactId>      <optional>true</optional>  </dependency>

    配置文件配置属性

    #线程池配置xmall:  thread:    core-size: 20    max-size: 200    keep-alive-time: 10

    使用配置文件中的属性

    @EnableConfigurationProperties(ThreadPollConfigProperties.class),如果配置文件类没有添加@Component加入容器可以使用这种方式

    package cn.cloud.xmall.product.config;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;//@EnableConfigurationProperties(ThreadPollConfigProperties.class)@Configurationpublic class MyThreadConfig {    @Bean    public ThreadPoolExecutor threadPoolExecutor(ThreadPollConfigProperties pool){       return new ThreadPoolExecutor(                pool.getCoreSize(),                pool.getMaxSize(),                pool.geTKEepAliveTime(),                TimeUnit.SECONDS,                new LinkedBlockingQueue<>(100000),                Executors.defaultThreadFactory(),                new ThreadPoolExecutor.AbortPolicy()                );    };}

    注入线程池

        @Autowired    private ThreadPoolExecutor executor;

    异步编排

        @Override    public SkuItemVo item(Long skuId) throws ExecutionException, InterruptedException {        SkuItemVo skuItemVo = new SkuItemVo();        //1.使用自己的线程池来新建异步任务        CompletableFuture<SkuInfoEntity> infoFuture = CompletableFuture.supplyAsync(() -> {            //1.查询基本信息 pms_sku_info            SkuInfoEntity info = getById(skuId);            skuItemVo.setInfo(info);            return info;        }, executor);        //2.根据一号任务来继续调用        CompletableFuture<Void> saleAttrFuture = infoFuture.thenAcceptAsync((res) -> {            //3.获取当前spu的销售属性组合            List<SkuItemSaleAttrVo> saleAttrVos = saleAttrValueService.getSaleAttrsBySpuId(res.getSpuId());            skuItemVo.setSaleAttr(saleAttrVos);        }, executor);        //3.根据一号任务来继续调用        CompletableFuture<Void> descFuture = infoFuture.thenAcceptAsync((res) -> {            //4.获取Spu的介绍 pms_spu_info_desc            SpuInfoDescEntity spuInfo = spuInfoDescService.getById(res.getSpuId());            skuItemVo.setDesc(spuInfo);        }, executor);        //4.根据一号任务来继续调用        CompletableFuture<Void> baseAttrFuture = infoFuture.thenAcceptAsync((res) -> {            //5.获取spu的规格参数信息            List<SpuItemAttrGroupVo> attrGroups = attrGroupService.getAttrGroupWithAttrsBySpuId(res.getSpuId(), res.getCatalogId());            skuItemVo.setGroupAttrs(attrGroups);        }, executor);        //此任务不需要根据一号任务的返回调用,所以开一个新线程        CompletableFuture<Void> imagesFuture = CompletableFuture.runAsync(() -> {            //2.获取sku的图片信息 pms_sku_images            List<SkuImagesEntity> images = imagesService.getImagesBySkuId(skuId);            skuItemVo.setImages(images);        }, executor);        //等待所有任务都完成        //TODO 可以选择有异常情况下的处理结果        CompletableFuture.allOf(saleAttrFuture,descFuture,baseAttrFuture,imagesFuture).get();                return skuItemVo;    }

    关于“Java中的异步与线程池怎么创建使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

    --结束END--

    本文标题: Java中的异步与线程池怎么创建使用

    本文链接: https://www.lsjlt.com/news/346253.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • Java中的异步与线程池怎么创建使用
      这篇文章主要介绍“Java中的异步与线程池怎么创建使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中的异步与线程池怎么创建使用”文章能帮助大家解决问题。初始化线程的4种方式1.继承Thre...
      99+
      2023-07-04
    • 怎么在java中使用ThreadPoolExecutor创建一个线程池
      这篇文章给大家介绍怎么在java中使用ThreadPoolExecutor创建一个线程池,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发...
      99+
      2023-06-14
    • java中线程池最实用的创建与关闭指南
      目录前言线程池创建 只需要执行shutdown就可以优雅关闭 执行shutdownNow关闭的测试 总结前言 在日常的开发工作当中,线程池往往承载着一个应用中最重要的业务逻辑,因此我...
      99+
      2022-11-12
    • Python线程池thread pool怎么创建使用
      本文小编为大家详细介绍“Python线程池thread pool怎么创建使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python线程池thread pool怎么创建使用”文章能帮助大家解决疑惑,下面跟着小编的思路...
      99+
      2023-06-30
    • 详解Java线程池的使用(7种创建方法)
      目录 1. 固定数量的线程池a.  线程池返回结果b. ⾃定义线程池名称或优先级2. 带缓存的线程池3. 执⾏定时任务 a.&nbs...
      99+
      2023-03-24
      Java线程池 Java线程池使用 线程池
    • Linux pthread线程怎么创建与使用
      本篇内容介绍了“Linux pthread线程怎么创建与使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.前言线程与进程的区别 ...
      99+
      2023-06-29
    • Spring中怎么使用ThreadPoolTaskExecutor自定义线程池及异步调用
      这篇文章主要介绍了Spring中怎么使用ThreadPoolTaskExecutor自定义线程池及异步调用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring中怎么使用ThreadPoolTaskExec...
      99+
      2023-06-29
    • java中多线程与线程池的基本使用方法
      目录前言继承Thread 实现Runnale接口Callable线程池常见的4种线程池。总结前言 在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,服务器...
      99+
      2022-11-12
    • Java中怎么使用Thread和Runnable创建线程
      这篇“Java中怎么使用Thread和Runnable创建线程”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中怎么使...
      99+
      2023-07-02
    • Java线程创建与Thread类的使用方法
      目录1.线程与Thread类1.1操作系统中的线程与Java线程1.1.1线程与Thread类1.1.2Thread类的构造方法1.1.3启用java线程必会的方法1.2第一个Jav...
      99+
      2022-11-13
    • 怎么在Java中使用线程工厂监控线程池
      这期内容当中小编将会给大家带来有关怎么在Java中使用线程工厂监控线程池,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。ThreadFactory线程池中的线程从哪里来呢?就是ThreadFoctorypu...
      99+
      2023-06-14
    • Java中怎么创建自己的线程对象
      本篇内容主要讲解“Java中怎么创建自己的线程对象”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中怎么创建自己的线程对象”吧!默认情况下,主线程和垃圾回收线程都是由系统创建的,但是我们需...
      99+
      2023-06-02
    • 怎么在python中使用threading创建线程
      本篇文章为大家展示了怎么在python中使用threading创建线程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究...
      99+
      2023-06-14
    • 怎么在Java并发包中使用ThreadPoolExecutor线程池
      这篇文章给大家介绍怎么在Java并发包中使用ThreadPoolExecutor线程池,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、线程池简介线程池的使用主要是解决两个问题:①当执行大量异步任务的时候线程池能够提供...
      99+
      2023-06-15
    • 怎么使用Java多线程Future获取异步任务
      本篇内容主要讲解“怎么使用Java多线程Future获取异步任务”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Java多线程Future获取异步任务”吧!Runnable的局限性在前文中...
      99+
      2023-07-05
    • SpringBoot中怎么使用异步线程池实现生产环境批量数据推送
      今天小编给大家分享一下SpringBoot中怎么使用异步线程池实现生产环境批量数据推送的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
      99+
      2023-06-29
    • Java线程池队列中的延迟队列DelayQueue怎么使用
      今天小编给大家分享一下Java线程池队列中的延迟队列DelayQueue怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
      99+
      2023-07-04
    • 简要讲解Python编程中线程的创建与锁的使用
      创建线程 创建线程的两种方法: 1,直接调用threading.Thread来构造thread对象,Thread的参数如下: class threading.Thread(group=None, targe...
      99+
      2022-06-04
      线程 简要 Python
    • 使用Java无界队列的线程池会怎么样
      本篇内容主要讲解“使用Java无界队列的线程池会怎么样”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“使用Java无界队列的线程池会怎么样”吧!(1)背景引入今天跟大家聊一个互联网大厂的Java面...
      99+
      2023-06-04
    • 怎么使用Java线程池来优化我们的应用程序
      这篇文章主要介绍“怎么使用Java线程池来优化我们的应用程序”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Java线程池来优化我们的应用程序”文章能帮助大家解决问题。线程池是一种工具,但并不...
      99+
      2023-07-05
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作