首页 > 其他分享 >5.4 线程池

5.4 线程池

时间:2023-06-01 13:45:11浏览次数:37  
标签:Runnable 5.4 int 创建 Callable 任务 线程

线程池是一种管理线程的资源,它可以在系统中创建、重用和销毁线程。线程池的主要优点是减少了创建和销毁线程的开销,提高了系统的性能。

Java中的线程池由java.util.concurrent.ExecutorService接口和它的实现类表示。ExecutorService提供了一些用于管理线程池的方法,如submit()execute()shutdown()等。

5.3.1 创建线程池

Java提供了几种创建线程池的方法:

  • Executors.newFixedThreadPool(int nThreads): 创建一个固定大小的线程池,最多可以同时运行nThreads个线程。
  • Executors.newCachedThreadPool(): 创建一个可缓存的线程池,如果线程池的当前大小超过处理需求,则回收空闲的线程;如果需要额外线程,则创建新线程。
  • Executors.newSingleThreadExecutor(): 创建一个只有一个线程的线程池。
  • Executors.newScheduledThreadPool(int corePoolSize): 创建一个可以定时执行任务的线程池。

5.3.2 使用线程池

我们可以使用ExecutorServicesubmit()execute()方法将任务提交给线程池。这些任务通常是实现java.lang.Runnable接口或java.util.concurrent.Callable接口的类的实例。

Runnable接口的任务没有返回值,而Callable接口的任务可以返回一个值。如果任务是Callable实例,我们可以使用submit()方法提交任务,并获得一个java.util.concurrent.Future实例,该实例表示任务的结果。

示例:使用线程池执行任务

import java.util.concurrent.*;

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // 使用execute()方法提交Runnable任务
        for (int i = 0; i < 5; i++) {
            executor.execute(new RunnableTask(i));
        }

        // 使用submit()方法提交Callable任务
        Future<Integer> future = executor.submit(new CallableTask());
        try {
            System.out.println("CallableTask的结果: " + future.get());
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        executor.shutdown();
    }
}

class RunnableTask implements Runnable {
    private int taskId;

    public RunnableTask(int taskId) {
        this.taskId = taskId;
    }

    @Override
    public void run() {
        System.out.println("RunnableTask " + taskId + " is running.");
    }
}

class CallableTask implements Callable<Integer> {
    @Override
    public Integer call() {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        return sum;
    }
}

在上述示例中,我们创建了一个固定大小的线程池,并提交了5个Runnable任务和1个Callable任务。我们还使用Future实例获取了Callable任务的结果。

5.3.3 关闭线程池

当我们不再需要线程池时,应该将其关闭。可以使用ExecutorServiceshutdown()方法或shutdownNow()方法关闭线程池。shutdown()方法会等待所有已提交的任务完成,而shutdownNow()方法会尝试立即停止所有正在执行的任务。

小结

在本章节,我们讨论了Java多线程与并发的“5.3 线程池”。我们了解了如何创建线程池、如何使用线程池执行任务以及如何关闭线程池。线程池是Java并发编程中的重要概念,可以帮助我们更有效地管理线程资源,提高程序性能。

请务必多加实践,以便更好地掌握这些知识点。祝你学习顺利!
推荐阅读:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

file

标签:Runnable,5.4,int,创建,Callable,任务,线程
From: https://www.cnblogs.com/yaoqian/p/17448686.html

相关文章

  • python selenium框架解决ip代理框不能自动化登录,解决pyautogui开不了多线程问题
    有时候我们使用python自动化框架的时候,打开一个网页的时候,它会出现出线这一种登录框,我们f12检查不了,用开发者工具强制检查里面没有任何属性.那这时候我们就可以用到python第三方库:pyautoguiPyAutoGUI:是一个Python库,可用于自动化GUI(图形用户界面)程序的任务。它可以让Pytho......
  • 什么样的服务器适合做APP?45.125.46.x
    现如今,智能手机已经越来越普及,随着智能手机的普及,同时催生了各类APP,很多企业除了建立官方网站,也会创建自家的APP,增加传播渠道,也是竞争途径之一。那么好的APP就非常重要了,在开发APP之前,我们还需要选择一款合适的服务器作为支撑,应该怎么选APP服务器的配置呢?选择APP服务器要从哪些配置......
  • .net耗时:多线程分段并发执行与单线程异步执行
    多线程执行存在线程切换的耗时,可采用单线程异步执行。性能根据实际情况调优。结合上面两种情况:可实现多线程异步执行。目前先看看下面两个例子1 多线程分段执行设备查找耗时操作///<summary>///异步查询设备///</summary>///<paramna......
  • Spring Boot 定时任务单线程和多线程配置
    第一种:把参数配置到.properties文件中:代码:packagecom.accord.task;importjava.text.SimpleDateFormat;importjava.util.Date;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;/***从配置文件加载......
  • 【Java】线程池配置
     先看JUC包自带的一个资源线程池执行器:初始化参数如下ThreadPoolExecutorthreadPoolExecutor=newThreadPoolExecutor(corePoolSize,//核心线程数量maximumPoolSize,//峰值线程数量keepAliveTime,//保留时限,当线程数量超出峰值数量时,保......
  • 线程饥饿导致性能下降
    线上反馈signalR推送有延期CPU和内存都是90%左右,由于经费的问题,让我们先尝试优化代码。看了一下核心代码设置了信号量为50,限制速度。果断增大为100。 生产环境更新后,一点作用都没有,高峰期还是有延期,作用不大。最后发现当前服务器有有一个报表服务,下午跑报表抢占了线程......
  • python获取threading多线程的return返回值
    转载:(15条消息)python获取threading多线程的return返回值_pythonthreading返回值_星火燎愿的博客-CSDN博客我们正常使用threading模块创建的线程是无法获取它所执行方法的返回值的;如:w=threading.Thread(target=worker,args=(i,))一、重写线程,获取线程return返回值要想获......
  • 多线程-线程池与java内存模型
    多线程-线程池与java内存模型线程池的使用(思路:什么是线程池->他的基本构造以及参数含义->如何使用,使用过程中需要注意什么->有哪些好用的工具类)线程池的基笨概念:首先看一下的继承关系,其次看他的状态,它是利用int的高三位表示状态,比如111表示能接受任务,具体看下面第二章图......
  • JS大文件分片上传/多线程上传
    ​ 一、概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。 二、Range  用于请求头......
  • redis是单线程还是多线程?为什么redis那么快?
    redis是单线程的。官方表示,Redis是基于内存操作,CPU不是Redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽,既然可以使用单线程来实现,就使用单线程了!Redis为什么单线程还这么快?1、误区1:高性能的服务器一定是多线程的?2、误区2:多线程一定比单线程效率高?多线程需要cpu调......