图文详解Java线程和线程池

图文详解Java线程和线程池

什么是线程

线程是操作系统能够进行运算调度的最小单位。一个进程可以包含多个线程,线程共享进程资源,但是是CPU分配资源的独立单位。

Java中的线程

Java中的线程是使用Thread类对象来创建。Java中的线程有以下几种状态:新建状态、可运行状态、阻塞状态和死亡状态。在Java中,实现多线程有两种方式,一是继承Thread类,二是实现Runnable接口。

继承Thread类

继承Thread类可以通过重写run()方法来实现多线程。

public class MyThread extends Thread {
     public void run(){
         System.out.println("MyThread running");
     }
}
MyThread thread = new MyThread();
thread.start();

实现Runnable接口

实现Runnable接口可以通过重写run()方法来实现多线程。与继承Thread类相比,实现Runnable接口可以更好的利用类的继承树,可以多个线程共享一个Runnable对象。

public class MyRunnable implements Runnable {
    @Override
    public void run(){
        System.out.println("MyRunnable running");
    }
}
MyRunnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();

线程池

线程池是用来保存一定数量的线程,随时用于处理任务。线程池中线程的数量是可以动态调整的,这样可以避免为每一个任务都创建线程导致的资源浪费和过度使用系统资源的问题。Java中的线程池是通过ThreadPoolExecutor实现的。

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

参数说明

参数 说明
corePoolSize 线程池维护的最少线程数量。
maximumPoolSize 线程池维护的最大线程数量。
keepAliveTime 线程池维护的线程的空闲时间。规定时间后,线程没有任务会被销毁。
workQueue 用于保存任务的阻塞队列。
threadFactory 线程工厂,用于创建线程。
handler 在任务被拒绝添加时,用于处理rejectedExecution。

示例1

public class ThreadPoolDemo {
    static class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + " is running");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        for (int i = 0; i < 5; i++) {
            executorService.execute(new MyRunnable());
        }
        executorService.shutdown();
    }
}

以上代码创建了一个固定大小为2的线程池,总共有5个任务需要执行,结果会将任务平均分配到两个线程中运行。通过调整corePoolSize和maximumPoolSize,我们可以改变线程池的大小。

示例2

public class ThreadPoolDemo {
    static class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + " is running");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ExecutorService executorService = new ThreadPoolExecutor(2, 4,
                5,TimeUnit.SECONDS,new LinkedBlockingDeque<>(5));
        for (int i = 0; i < 10; i++) {
            executorService.execute(new MyRunnable());
        }
        executorService.shutdown();
    }
}

以上代码创建了一个核心池大小为2,最大池大小为4的线程池,线程池使用LinkedBlockingDeque存储任务。当线程池中没有空闲线程时,新任务会被加入到LinkedBlockingDeque中。有界队列可以有效防止资源耗尽的情况。

通过以上两个示例我们可以了解Java线程和线程池相关的知识,学习和运用这些知识可以有效提高Java程序的性能和资源利用率。

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

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

相关文章

  • Springboot集成MongoDB存储文件、读取文件

    一、前言和开发环境及配置 可以转载,但请注明出处。   之前自己写的SpringBoot整合MongoDB的聚合查询操作,感兴趣的可以点击查阅。 https://www.cnblogs.com/zaoyu/p/springboot-mongodb.html   使用mongodb存储文件并实现读取,通过springboot集成mongodb操作。  可以有两…

    Java 2023年4月17日
    00
  • Java 代码检查工具之PMD入门使用详细教程

    Java 代码检查工具之PMD入门使用详细教程 什么是PMD? PMD是Java代码检查工具之一,能够检查Java代码中的潜在问题和错误,是一种代码静态分析工具。PMD使用语音、复杂度、BUG等规则来检查代码以提高代码质量。PMD支持在Eclipse、Intellij IDEA和Maven等IDE和构建工具中使用。 PMD的安装 PMD是基于Java语言编写…

    Java 2023年5月20日
    00
  • SpringBoot 集成 Quartz + MySQL

    Quartz 简单使用Java SpringBoot 中,动态执行 bean 对象中的方法 源代码地址 => https://gitee.com/VipSoft/VipBoot/tree/develop/vipsoft-quartz 工作原理解读 只要配置好 DataSource Quartz 会自动进行表的数据操作, 添加 Quartz Job 任务…

    Java 2023年4月18日
    00
  • Java如何使用elasticsearch进行模糊查询

    下面是关于Java如何使用elasticsearch进行模糊查询的完整攻略。 准备工作 为了使用elasticsearch的模糊查询功能,我们需要先安装elasticsearch,然后使用Java API连接elasticsearch。这里以elasticsearch 7.15.1版本为例。 安装elasticsearch elasticsearch的安装过…

    Java 2023年5月26日
    00
  • cookie、session和java过滤器结合实现登陆程序

    实现登陆程序需要用到cookie、session和java过滤器,下面是实现登陆程序的完整攻略: 1.理解cookie和session Cookie是一小段文本信息,存在客户端浏览器上,用于存储一些关于用户的信息。一个浏览器对于同一个cookie的请求都会带上这个cookie。 Session是一种在服务器端保存用户数据的解决方案。Session的工作流程为…

    Java 2023年6月15日
    00
  • Win+Apache+PHP+MySQL+Tcomcat配置

    以下是关于Win+Apache+PHP+MySQL+Tomcat配置的完整攻略。 简介 该配置通常被称为Wamp或Mamp,是一种常用的Web开发环境配置解决方案。其中,Win代表Windows系统,Apache是一种流行的Web服务器软件,PHP是一种常用的服务器端脚本语言,MySQL则是一种开源的关系型数据库管理系统,Tomcat则是一种轻量级的Java…

    Java 2023年5月19日
    00
  • SpringBoot集成Spring security JWT实现接口权限认证

    下面是详细讲解“SpringBoot集成Spring security JWT实现接口权限认证”的完整攻略。 概述 在实际项目中,对于接口权限认证一直是非常重要的问题。在 SpringBoot 中使用 Spring Security 与 JWT(JSON Web Token)完成接口权限认证是一种常见的方式。本文将介绍如何在 SpringBoot 中集成 S…

    Java 2023年5月20日
    00
  • 解析spring-boot-starter-parent简介

    让我来详细讲解一下“解析spring-boot-starter-parent简介”的攻略。 标题 1. 简介 spring-boot-starter-parent是Spring Boot的一个parent pom,它包含许多通用的配置和依赖项,可以让我们更方便地创建基于Spring Boot的项目。在创建一个标准的Spring Boot项目时,一般都会继承s…

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