【Java 第九篇章】多线程实际工作中的头大的模块

news2024/11/24 7:08:13

多线程是一种编程概念,它允许多个执行路径(线程)在同一进程内并发运行。

一、多线程的概念和作用

1、概念

  • 线程是程序执行的最小单元,一个进程可以包含多个线程。每个线程都有自己的程序计数器、栈和局部变量,但它们共享进程的内存空间和其他资源(如打开的文件、网络连接等)。
  • 多线程就是在一个程序中同时运行多个线程,每个线程可以执行不同的任务或相同任务的不同部分。

2、作用

  • 提高程序性能:通过将一个大任务分解成多个小任务并在不同线程中并行执行,可以充分利用多核处理器的优势,减少程序的执行时间。例如,在图像编辑软件中,可以使用一个线程来处理用户界面的交互,另一个线程用于后台的图像渲染,从而提高整体的响应速度。

  • 增强程序的响应能力:在一些需要与用户进行实时交互的应用中,多线程可以确保即使在执行耗时操作时,程序仍然能够及时响应用户的输入。比如在网页浏览器中,一个线程可以用于加载网页内容,而另一个线程可以处理用户的鼠标点击和滚动操作,这样用户不会感觉到界面卡顿。

  • 实现异步操作:多线程使得程序可以在后台执行某些操作,而不阻塞主线程的执行。例如,在文件下载程序中,启动一个新线程来下载文件,主线程可以继续显示下载进度或执行其他任务,当下载完成后,再进行相应的处理。

3、线程和进程

  • 线程:一个进程中可以有多个线程,如看视频的同时可以听声音,看图像,看弹幕等等。
  • 进程: 操作系统中运行的程序就是进程,比如QQ、播放器、游戏、IDE等等。

二、实现多线程的方式

1、继承 Thread 类

定义一个类继承自Thread类,然后重写run方法,在run方法中编写线程要执行的任务代码。

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("This is a new thread.");
    }
}

启动线程

public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

当调用start方法时,Java 虚拟机会自动调用该线程的run方法来执行线程的任务。

2、实现Runnable接口

定义一个类实现Runnable接口,并实现run方法:

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("This is a thread implemented by Runnable.");
    }
}

启动线程

public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}

这种方式更加灵活,因为 Java 不支持多继承,如果一个类已经继承了其他类,就不能再继承Thread类了,此时可以采用实现Runnable接口的方式来创建线程。

3、实现 Callable 接口

在 Java 中,Callable接口是一种用于创建可以返回结果并且可能抛出异常的任务的方式。它与Runnable接口类似,但Callable可以返回结果,而Runnable的run方法没有返回值。

定义一个实现Callable接口的类

import java.util.concurrent.Callable;

public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        // 这里编写具体的任务代码,此示例中模拟一个耗时操作后返回结果
        Thread.sleep(2000);
        return "Callable 任务执行完成并返回结果";
    }
}

在主线程中使用Callable

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

public class Main {
    public static void main(String[] args) {
        // 创建一个线程池
        ExecutorService executorService = Executors.newSingleThreadExecutor();

        // 提交 Callable 任务到线程池并获取 Future 对象
        Future<String> future = executorService.submit(new MyCallable());

        try {
            // 从 Future 对象获取 Callable 任务的结果,如果任务未完成,此方法会阻塞直到任务完成
            String result = future.get();
            System.out.println(result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }

        // 关闭线程池
        executorService.shutdown();
    }
}

在上述代码中:

  • 首先定义了MyCallable类实现Callable接口,并重写call方法来执行具体的任务,这里模拟了一个耗时操作(通过Thread.sleep)后返回一个字符串结果。
  • 在main方法中,创建了一个单线程的线程池ExecutorService,通过submit方法将MyCallable任务提交到线程池中执行,submit方法会返回一个Future对象,这个对象可以用来获取任务的执行结果。然后通过future.get方法获取任务的结果,如果任务还未完成,get方法会阻塞当前线程直到任务完成。最后关闭线程池。

使用Callable接口可以方便地在多线程环境中执行有返回值的任务,并且可以通过Future对象来管理任务的执行状态和结果。这在需要执行一些耗时的计算并获取结果的场景中非常有用,比如在网络请求、数据库查询等操作中。

三、线程的五种状态

线程存在五种状态分别是:创建状态、就绪状态、阻塞状态、死亡状态、运行状态。

在这里插入图片描述

四、多线程的优点和挑战

1、优点

  • 资源共享:由于线程共享进程的内存空间,它们可以方便地共享数据和资源。这使得在多个线程之间传递信息和协作变得相对容易。例如,多个线程可以同时访问和修改同一个数组,而不需要进行复杂的数据传递和复制操作。
  • 提高效率:如前面提到的,多线程能够充分利用多核处理器的优势,将任务并行执行,从而提高程序的整体效率。特别是对于计算密集型和 I/O 密集型任务,多线程可以显著减少执行时间。
  • 简化程序结构:对于一些复杂的应用程序,将任务分解为多个线程可以使程序的结构更加清晰和易于维护。每个线程可以专注于执行一个特定的子任务,使得代码的逻辑更加模块化。

2、挑战

  • 线程安全问题:当多个线程同时访问和修改共享数据时,可能会导致数据不一致或程序错误。例如,两个线程同时对一个计数器进行递增操作,如果不采取适当的同步措施,可能会导致计数器的值不准确。常见的解决方法包括使用synchronized关键字、Lock接口等进行线程同步。
  • 死锁:在多线程编程中,如果多个线程相互等待对方持有的资源,就会导致死锁。例如,线程 A 持有资源 X 并等待资源 Y,而线程 B 持有资源 Y 并等待资源 X,这时两个线程都无法继续执行,程序就会陷入死锁状态。避免死锁需要合理的资源分配策略和线程同步设计。
  • 线程调度复杂性:操作系统负责线程的调度,决定哪个线程何时可以执行。然而,线程的调度是不可预测的,这可能导致程序的执行顺序不确定。例如,在一个多线程的游戏程序中,如果线程调度导致游戏逻辑的执行顺序不一致,可能会出现画面闪烁或游戏状态异常等问题。这就需要程序员在编写多线程程序时,充分考虑到各种可能的执行顺序,并进行适当的处理。

TODO: 未解决的问题

  • 线程的方法:
    • 停止线程
    • 休眠线程
    • 礼让线程
    • 合并线程
  • 线程优先级:
  • 守护进程:
  • 线程同步:
  • 同步方法:
    • synchronized
  • 死锁:
  • Lock锁:
  • 生产者和消费者:
    • 解决方式:
      • 利用缓冲去解决:管道法
      • 信号灯法:标志位
  • 线程池:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1986565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Motionface ai工具有哪些?

Motionface Android/PC 用一张静态含有人脸相片来生成一个能说会唱的虚拟主播。使用简单便捷&#xff0c;极致的流畅度体验超乎您的想象。 免费下载 Respeak PC电脑软件 任意视频一键生成虚拟主播&#xff0c;匹配音频嘴型同步&#xff0c;保留原视频人物神态和动作&#xff0c…

核显硬刚RTX 4070,AMD全新APU杀疯了

这年头&#xff0c;一台平民玩家低预算主流桌面电脑主机是什么配置&#xff1f; Intel i5 12400F CPU、B760 主板、NVIDIA RTX 4060 显卡、双 8G DDR4 内存、1T 固态硬盘的组合&#xff0c;想必相当具有代表性了吧&#xff01; 但仔细掰开后我们不难发现&#xff0c;这套不到…

生物信息学入门:Linux学习指南

还没有使用过生信云服务器&#xff1f;快来体验一下吧 20核心256G内存最低699元半年。 更多访问 https://ad.tebteb.cc 介绍 大家好&#xff01;作为一名生物信息学的新人&#xff0c;您可能对Linux感到陌生&#xff0c;但别担心&#xff0c;本教程将用简单明了的方式&#xff…

Cache结构

Cache cache的一般设计 超标量处理器每周期需要从Cache中同时读取多条指令&#xff0c;同时每周期也可能有多条load/store指令会访问Cache&#xff0c;因此需要多端口的Cache L1 Cache&#xff1a;最靠近处理器&#xff0c;是流水线的一部分&#xff0c;包含两个物理存在 指…

解决windows安装docker desktop打开报错问题

下载docker windows版本: https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe?utm_sourcedocker&utm_mediumwebreferral&utm_campaigndd-smartbutton&utm_locationmodule 正常安装&#xff0c;然后运行&#xff0c;弹出这个报错: 试了…

力扣 两数之和

致每一个初学算法的你。 题目 时间复杂度&#xff1a;O(N^2)&#xff0c; 空间复杂度&#xff1a;O(1) 。 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for (int i 0; i < n; i) {for (int j i 1; j < n; j) {if (nums[i] …

RK3568平台开发系列讲解(文件系统篇)Linux内核中 文件的三个数据结构

在内核中,与文件描述符相关的三个主要数据结构分别是: 文件描述符表(进程级):这是每个进程所拥有的数据结构,用于维护进程中打开的所有文件描述符。每个 fd 在这个表中都有一个对应的条目,指向更底层的文件表示结构。 打开文件列表(系统级):这是一个全系统范围内的数…

DC-5靶场实战模拟

信息收集 端口和网段信息&#xff1a;使用nmap扫描 //扫描网段中存货的主机 nmap -sP 192.168.10.0/24 //进行对主机进行猜测-》发现接口&#xff1a;80存活 nmap -sV 192.168.10.245 目录信息 &#xff1a;使用dirbuster 指纹信息 找漏洞 发现web 中contact有提交界面进行…

[设备] 关于手机设备中几种传感器的研究

一、手机设备中三位坐标系概念 X轴的方向&#xff1a;沿着屏幕水平方向从左到右&#xff0c;如果手机如果不是是正方形的话&#xff0c;较短的边需要水平 放置&#xff0c;较长的边需要垂直放置。Y轴的方向&#xff1a;从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端Z轴…

linux操作——yum、systemctl、firewall、hostname、、、

一、什么是yum yum是一种在Linux操作系统中使用的软件包管理器。它可以用来从软件仓库中下载、安装、更新和删除软件包。yum可以自动解决软件包之间的依赖关系&#xff0c;并且可以方便地查找和安装各种软件。在大多数基于Red Hat的Linux发行版中&#xff0c;如CentOS和Fedora&…

牛客 JZ31.栈的压入,弹出序列 C++写法

牛客 JZ31.栈的压入&#xff0c;弹出序列 C写法 思路&#x1f914;&#xff1a; 创建一个栈&#xff0c;push压入序列&#xff0c;然后用栈顶跟弹出序列比&#xff0c;如果一样就出栈并且继续比较&#xff0c;不一样就再次push入栈&#xff0c;直到压入序列走完&#xff0c;如果…

部署伪分布式 Hadoop集群

部署伪分布式 Hadoop集群 一、JDK安装配置1.1 下载JDK1.2 上传解压1.3 java环境配置 二、伪分布式 Hadoop 安装配置2.1 Hadoop 下载2.2 上传解压2.3 Hadoop 文件目录介绍2.4 Hadoop 配置2.4.1 修改 core-site.xml 配置文件2.4.2 修改 hdfs-site.xml 配置文件2.4.3 修改 hadoop-…

【从零开始一步步学习VSOA开发】URL 资源标识

URL 资源标识 概念 在 VSOA 的世界里&#xff0c;所有的差异化均得到统一&#xff0c;所有的硬件、软件服务均提供统一的资源标签 URL。类似 http://&#xff0c;VSOA 的 URL 以 vsoa:// 开始。下面通过 2 个例子介绍 VSOA 统一资源标识的好处&#xff1a; 匹配规则 URL 标…

Modbus poll和Modbus Mbslave的使用

读取Modbus Mbslave中的数据 首先创建COM1和COM2端口 然后 using System.IO.Ports; ​ namespace 通信 {internal class Program{static void Main(string[] args){Console.WriteLine("Hello, World!");SerialPort serialPort new SerialPort("COM1",960…

前缀和专题

板子&#xff1a; &#xff08;占坑&#xff09; Leetcode 238. 除自身以外数组的乘积 优化前&#xff1a;使用前后缀数组记录 class Solution { public:vector<int> productExceptSelf(vector<int>& nums) {int n nums.size();vector<int> pre(n, 1),…

JMeter 压测Http接口

前言 今天产品在会议上吐槽说我们的服务接口连一点点压力都扛不住&#xff0c;用户稍微用下翻译功能&#xff0c;就报错 429。我一听 429 就觉得不对劲&#xff0c;明明4xx 的错误码应该找前端才对的&#xff0c;怎么能找我这个前端后端运维测试工程师呢&#xff1f; 如果是产…

如何在生成式AI里使用 Ray Data 进行大规模 RAG 应用的 Embedding Inference

检索增强生成 (RAG) 是企业级生成式 AI&#xff08;GenAI&#xff09;应用的热门案例之一。多数 RAG 教程演示了如何利用 OpenAI API 结合 Embedding 模型和大语言模型&#xff08;LLM&#xff09;来进行推理&#xff08;Inference&#xff09;。然而&#xff0c;在开发过程中&…

【第16章】Spring Cloud之Gateway全局过滤器(安全认证)

文章目录 前言一、公共模块1. 引入依赖2. 工具类 二、用户服务1. 新建模块2. 引入依赖3. 启动类4. 基本配置5. 登录接口 三、网关服务1. 引入依赖2. 应用配置3. 自定义过滤器 四、单元测试1.介绍2. 登录接口3. 提供者接口3.1 无token3.2 有token 总结 前言 我们已经接入了网关…

构造散列表以及处理冲突问题

目录 一. 散列表的基本概念 二. 散列表的冲突问题 三. 构造散列函数 四. 处理冲突 一. 散列表的基本概念 散列表简而言之就是一个根据一个对应关系&#xff08;这个对应关系也叫散列函数&#xff09;来存储关键码&#xff08;关键字&#xff09;的一个表。 例如&#xff0c;…

SSM电子商务系统-计算机毕业设计源码68470

基于SSM框架的电子商务系统的设计与实现 摘 要 随着电子商务的迅猛发展和计算机信息技术的全面跃升&#xff0c;网上购物系统由于其迎合了人们诉求和期望而渗入社会生活各个层面和角落。本文设计并实现了一个基于SSM框架的电子商务系统。该系统旨在为用户提供一个舒适且快捷的…