搞懂Java线程池

搞懂Java线程池

简介

Java中的线程池是一种常见的并发编程工具,它可以让程序更高效地利用系统资源以及更好地进行线程管理。线程池采用预分配线程的方式,从而避免了线程的频繁创建与销毁,这样可以在一定程度上提升程序的性能。同时,线程池还可以对线程进行池化、回收、重用等操作,从而进一步提升程序的运行效率。

线程池的使用

Java线程池的使用十分简洁,可以分为几个步骤:

  1. 创建线程池,可以通过Executors类提供的静态方法来完成,也可以通过自定义线程池来创建。
  2. 创建一个需要并行执行的任务。
  3. 将任务添加到线程池中。
  4. 执行任务。

下面我们以几个示例来说明Java线程池的使用。

示例1:计算数字和

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class CalculateTask implements Runnable {

    private int startNum;
    private int endNum;

    CalculateTask(int startNum, int endNum) {
        this.startNum = startNum;
        this.endNum = endNum;
    }

    public void run() {
        long sum = 0;
        for (int i = startNum; i <= endNum; i++) {
            sum += i;
        }
        System.out.println(Thread.currentThread().getName() + " : " + sum);
    }
}

public class ThreadPoolExample1 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        executorService.execute(new CalculateTask(1, 10));
        executorService.execute(new CalculateTask(11, 20));
        executorService.shutdown();
    }
}

在这个示例中,我们创建了一个简单的任务类CalculateTask,该任务用于计算某个区间内的数字和。使用Executors.newFixedThreadPool(2)方法创建了一个固定大小为2的线程池,随后分别将CalculateTask任务添加到线程池中并执行。

示例2:爬虫

import java.io.IOException;
import java.net.URL;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class CrawlerTask implements Runnable {
    private String url;

    CrawlerTask(String url) {
        this.url = url;
    }

    public void run() {
        try {
            String content = new Scanner(new URL(url).openStream(), "UTF-8").useDelimiter("\\A").next();
            System.out.println(Thread.currentThread().getName() + " : " + url);
        } catch (IOException e) {
            System.out.println("Failed to crawl " + url);
        }
    }
}

public class ThreadPoolExample2 {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(4);
        String[] urls = {"https://www.baidu.com", "https://www.sogou.com", "https://www.google.com", "https://www.bing.com"};
        for (String url : urls) {
            executorService.execute(new CrawlerTask(url));
        }
        executorService.shutdown();
    }
}

在这个示例中,我们创建了一个简单的爬虫任务类CrawlerTask,该任务用于爬取某个网址的内容。使用Executors.newFixedThreadPool(4)方法创建了一个固定大小为4的线程池,随即分别将若干个CrawlerTask任务添加到线程池中并执行。

参考文献

以上介绍的内容只是Java线程池的冰山一角,详情可以参考Java官网关于并发编程指南的相关介绍。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:搞懂Java线程池 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • spring boot整合spring-kafka实现发送接收消息实例代码

    下面我将为您详细讲解spring boot整合spring-kafka实现发送接收消息的攻略。 一、集成Spring-Kafka依赖 在pom.xml文件中添加spring-kafka的依赖: <dependency> <groupId>org.springframework.kafka</groupId> <art…

    Java 2023年5月20日
    00
  • java String到底有多长?String超出长度该如何解决

    Java中的String类型是一种特殊的引用类型,用于表示字符串。在Java中,字符串是不可变的,也就是说一旦创建就不能再修改了,所以内存中的字符串是一个长度固定的字符数组,但是这个长度是不确定的。 Java中的String类型的长度并不是固定的,而是动态分配的,具体大小取决于String对象中存储的字符数量。当创建一个新的String对象时,Java会根据…

    Java 2023年5月27日
    00
  • SpringBoot如何根据用户系统时区动态展示时间

    首先,在SpringBoot中获取当前用户的时区,一般采用以下方式: @RequestMapping("/getTime") public String getTime(HttpServletRequest request) { TimeZone timeZone = (TimeZone) request.getSession().get…

    Java 2023年5月20日
    00
  • Java 实战项目之小说在线阅读系统的实现流程

    首先让我们来讲解一下“Java 实战项目之小说在线阅读系统的实现流程”。 1. 系统功能需求分析 在开发小说在线阅读系统之前,我们需要对系统的功能需求进行分析,以确保开发出的系统能够满足用户的要求。在这个阶段,我们需要做以下工作: 确定系统的用户类型:读者、作者和管理员等。 确定系统的基本功能模块:用户注册、登录、小说分类、小说搜索、在线阅读、小说管理、用户…

    Java 2023年5月24日
    00
  • java的Hibernate框架报错“TransactionException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“TransactionException”错误。这个错误通常是由于以下原因之一引起的: 数据库连接错误:如果您的数据库连接错误,则可能会出现此错误。在这种情况下,需要检查您的数据库连接配置以解决此问题。 事务管理器配置错误:如果您的事务管理器配置错误,则可能会出现此错误。在这种情况下,需要检查您的事务管理…

    Java 2023年5月4日
    00
  • SpringBoot利用jackson格式化时间的三种方法

    下面是SpringBoot利用jackson格式化时间的三种方法完整攻略: 1. 使用@JsonFormat注解 使用@JsonFormat注解是SpringBoot格式化时间最简单的方法之一,只需要在实体类的时间字段上加上该注解,指定格式即可。 示例: 假设我们有一个用户实体类,其中有一个创建时间字段: public class User { privat…

    Java 2023年5月20日
    00
  • 值得收藏的9个提高代码运行效率的小技巧(推荐)

    值得收藏的9个提高代码运行效率的小技巧(推荐) 在代码编写时,优化程序的效率是非常重要的。本文提供了9个小技巧,可以帮助你提高代码的运行效率。 1. 使用map而不是for循环 使用 map() 命令可以在 Python 中更快地编写相同的代码。 它对列表中的每个元素执行相同的操作,并返回结果的列表。下面是一个示例: # 使用 for 循环 data = […

    Java 2023年5月23日
    00
  • MyBatis的五种批量查询实例总结

    MyBatis的五种批量查询实例总结 1. 需要批量查询的场景 在实际的开发中,我们常常会遇到需要批量查询数据的场景,如查询一个部门下所有的员工信息、查询某个账户下所有的交易明细信息等等。这些场景中,我们需要查询的数据量比较大,单次查询的效率较低,因此需要采用批量查询的方式来提高查询效率。 2. MyBatis的五种批量查询实例 下面我们介绍MyBatis的…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部