图文详解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项目快速实现Aop功能

    下面是关于“Springboot项目快速实现Aop功能”的完整攻略,希望对你有帮助。 什么是AOP AOP,全称为Aspect Oriented Programming,即面向切面编程。它是一种基于OOP的扩展,旨在通过预编译方式和运行期动态代理实现程序的透明化、模块化、松耦合等功能。通俗的理解就是,把一些常用功能提取出来,不用在每个业务场景都写一遍,比如日…

    Java 2023年5月19日
    00
  • java设计简单学生管理系统

    Java设计简单学生管理系统攻略 1. 概述 学生管理系统是一种常见的软件应用,用于管理学生的基本信息和分数等。Java是一种面向对象的编程语言,可以使用Java来设计学生管理系统。本攻略将介绍设计一个简单的学生管理系统的完整过程。 2. 设计思路 设计学生管理系统,首先需要明确系统的功能需求。主要包括以下几个方面: 学生信息管理:包括添加学生,删除学生,修…

    Java 2023年5月23日
    00
  • java如何将Object数组转换为指定类型数组

    将Object数组转换为指定类型数组的过程需要进行类型强转,下面是具体的步骤和示例。 创建指定类型数组 首先,需要确定要转换成哪种类型的数组,然后使用数组的静态方法创建一个指定类型的数组。例如创建一个字符串数组: String[] array = new String[objectArray.length]; 遍历Object数组 使用for循环或者for-…

    Java 2023年5月26日
    00
  • 使用SpringMVC返回json字符串的实例讲解

    我将为您讲解使用SpringMVC返回JSON字符串的实例攻略。 1. 实现步骤 SpringMVC实现返回JSON字符串的步骤大致如下: 在pom.xml文件添加依赖: <dependencies> <!– SpringMVC核心包 –> <dependency> <groupId>org.springf…

    Java 2023年6月15日
    00
  • java中的异或问题代码解析

    本文将详细讲解Java中异或问题的相关知识,并提供两个示例方便理解。 异或运算符(^) 在Java中,异或运算符(^)表示将两个数据的每个二进位进行比较,如果相同则返回0,不同则返回1。例如: int a = 5 ^ 3; // a 的值为 6 上述代码将数值5和3进行异或运算,结果为6。 异或运算的特性 在异或运算中,有三个特性需要特别说明: 交换律 对于…

    Java 2023年5月23日
    00
  • Mac OS下为Android Studio编译FFmpeg解码库的详细教程

    下面是Mac OS下为Android Studio编译FFmpeg解码库的详细教程: 1. 安装 homebrew homebrew 是 Mac OS 上的包管理器,可以通过命令行轻松安装各种软件和工具。 安装 homebrew,可以在终端内运行以下命令: /bin/bash -c "$(curl -fsSL https://raw.githubu…

    Java 2023年5月20日
    00
  • java搜索无向图中两点之间所有路径的算法

    Java搜索无向图中两点之间所有路径的算法 算法思路 该算法使用深度优先搜索来查找两个节点之间的所有路径。在搜索期间,对于每个遍历到的未访问节点,我们可以标记它为已访问,并沿着它的所有未访问邻居递归搜索。在这个过程中,我们将到达一个目标节点作为目标终点,或遍历了所有的节点,这代表着没有路径可以到达目标终点,此时我们就回溯到上一步去探索其它可能的路径,直到找到…

    Java 2023年5月26日
    00
  • java String的intern方法

    针对您提出的问题,以下是Java String类中的intern()方法的详细回答。 一、什么是intern方法 Java中的String是不可变的,这意味着每当我们对String变量进行更改时,会创建新的String实例。许多String实例可能会具有相同的值。由于String在Java中很常见,因此频繁创建String对象的操作可能会非常昂贵,从而导致性…

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