图文详解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日

相关文章

  • 搞懂Java线程池

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

    Java 2023年5月18日
    00
  • SpringBoot整合Druid数据源过程详解

    以下是SpringBoot整合Druid数据源的详细攻略。 准备工作 引入相关依赖 为了使用Druid数据源,我们需要在pom.xml文件中添加以下依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-star…

    Java 2023年5月20日
    00
  • Spring Boot部署到Tomcat过程中遇到的问题汇总

    下面我将为你详细讲解“Spring Boot部署到Tomcat过程中遇到的问题汇总”的完整攻略。 一、背景知识 在部署Spring Boot应用程序的时候,通过打包为war包的方式将程序部署到Tomcat服务器上是一个常用的方式。但是在这个过程中会遇到一些问题,比如资源文件的路径问题、类加载器的问题等。 二、部署过程中应注意的问题 2.1 静态资源文件路径问…

    Java 2023年5月19日
    00
  • JavaWeb实现邮件发送功能

    下面是JavaWeb实现邮件发送功能的完整攻略: 1. 准备工作 首先需要确保在本地或服务器上已经安装了Java环境和JavaMail API。 Java环境的安装可以参考官方文档:https://www.java.com/zh-CN/download/help/download_options.html JavaMail API的下载可以在官方网站上找到:…

    Java 2023年6月16日
    00
  • 如何优雅的处理异常

    作者:京东零售  秦浩然 一、什么是异常 Java 语言按照错误严重性,从 throwale 根类衍生出 Error 和 Exception 两大派系。 Error(错误): 程序在执行过程中所遇到的硬件或操作系统的错误。错误对程序而言是致命的,将导致程序无法运行。常见的错误有内存溢出,jvm 虚拟机自身的非正常运行,calss 文件没有主方法。程序本生是不…

    Java 2023年4月25日
    00
  • java实现计算器模板及源码

    感谢您对Java实现计算器模板及源码的关注。下面,我将详细讲解Java实现计算器模板及源码的完整攻略,包含以下内容: 确定需求 设计界面 实现程序逻辑 测试与调试 发布计算器程序 1. 确定需求 在开发计算器程序之前,我们需要先明确需求,即计算器需要完成哪些功能。一般来说,一个基本的计算器程序需要具备以下功能: 加法 减法 乘法 除法 取模 此外,还需要考虑…

    Java 2023年5月19日
    00
  • Java中SimpleDateFormat的使用方法

    下面是关于Java中SimpleDateFormat的使用方法的完整攻略,包含以下几个部分: SimpleDataFormat类的介绍 SimpleDataFormat类的常用构造方法 SimpleDataFormat类的常用方法 示例介绍 注意事项 1. SimpleDataFormat类的介绍 SimpleDataFormat是Java中处理日期和时间格…

    Java 2023年5月20日
    00
  • 详解使用Spring Security进行自动登录验证

    使用Spring Security进行自动登录验证可以分为以下几个步骤: 1、添加Spring Security依赖 在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework.security</groupId> <artifactId>sprin…

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