搞懂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日

相关文章

  • 基于Java实现五子棋小游戏(附源码)

    针对“基于Java实现五子棋小游戏(附源码)”这篇文章,下面是我的完整攻略。 标题 文章的主标题是“基于Java实现五子棋小游戏(附源码)”,是直接说明文章要讲的内容,也可以吸引用户的注意力;副标题是“开发环境、实现思路、代码解析、附带完整源码”,更加详细地介绍了文章会涉及到的方面。 代码块 代码块非常重要,而本文中五子棋小游戏的源码也是必不可少的一部分。文…

    Java 2023年5月26日
    00
  • Java调用Shell命令和脚本的实现

    Java调用Shell命令和脚本是一种常见的技术,可以为开发人员带来更灵活的开发方式。在这里,我们将详细讲解Java调用Shell命令和脚本的实现攻略。 什么是Shell命令和脚本 Shell命令和脚本都是运行在Linux/Unix系统上的脚本语言。Shell命令是一种命令行工具,用于在终端中实现系统管理任务。Shell脚本是一种执行自动化任务的脚本文件,可…

    Java 2023年5月26日
    00
  • js构造函数constructor和原型prototype原理与用法实例分析

    那么让我来详细讲解一下“js构造函数constructor和原型prototype原理与用法实例分析”的完整攻略。 什么是构造函数constructor? 在 JavaScript 中,构造函数是一种用于创建对象并初始化其属性的特殊函数。每个对象都是由一个构造函数生成的,JavaScript 内置了很多构造函数,比如 Array、String 等。 构造函数…

    Java 2023年5月23日
    00
  • Java 二维数组创建及使用方式

    Java 二维数组是一个数组,数组的每个元素又是一个数组,因此也被称为数组的数组。在Java中,可以使用两种方式来创建二维数组:静态初始化和动态初始化。 静态初始化 静态初始化是在创建数组时直接给数组赋初值,这种方式代码简单,但只能用于初始化固定长度的数组,不能动态添加和删除元素。 示例: int[][] a = {{1,2,3},{4,5,6},{7,8,…

    Java 2023年5月26日
    00
  • java.lang.OutOfMemoryError 错误整理及解决办法

    java.lang.OutOfMemoryError 错误整理及解决办法 1. 什么是 java.lang.OutOfMemoryError 错误 java.lang.OutOfMemoryError 错误通常是由于 JVM 在无法分配足够的内存或使用过多的内存资源时抛出的错误。它是一种运行时错误,表示 JVM 运行时无法为对象分配足够的内存。 2. 可能的…

    Java 2023年5月27日
    00
  • Java中使用json与前台Ajax数据交互的方法

    请看下面的完整攻略: Java中使用json与前台Ajax数据交互的方法 在前后端分离的开发模式中,我们通常使用Ajax进行数据交互,而json作为一种轻量级的数据格式,具有传输速度快、数据量小、易于解析等优点,因此被广泛应用于前后端的数据交互。本文将介绍Java中使用json与前台Ajax数据交互的方法。 一、搭建环境 为了演示方便,我们将使用Spring…

    Java 2023年5月26日
    00
  • Mybatis动态sql超详细讲解

    为了更好地说明“Mybatis动态sql超详细讲解”的相关内容,本次攻略将分以下几个方面进行讲解: 动态SQL简介 Mybatis动态SQL语句的使用 Mybatis动态SQL语句的实例解析 Mybatis动态SQL语句实例二 动态SQL简介 在实际开发中,SQL语句的执行往往需要根据不同的条件进行动态调整,这就是动态SQL的概念。动态SQL主要包括两种形式…

    Java 2023年5月19日
    00
  • java的主要特性学习总结

    关于Java的主要特性学习总结,我可以给出以下攻略: 学习Java主要特性的总结 1. Java的基本特性 Java的基本特性包括: 面向对象编程(OOP) 跨平台性(Platform independence) 简单性(Simplicity) 可扩展性(Scalability) 安全性(Security) 其中,面向对象编程的思想在Java中体现得淋漓尽致…

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