面试突击-多线程和IO专题(至尊典藏版)

news2024/9/19 17:24:10

多线程和IO专题

在这里插入图片描述

一、多线程专题

1.介绍下进程和线程的关系

进程:一个独立的正在执行的程序

线程:一个进程的最基本的执行单位,执行路径

image.png

多进程:在操作系统中,同时运行多个程序

多进程的好处:可以充分利用CPU,提高CPU的使用率

多线程:在同一个进程(应用程序)中同时执行多个线程

多线程的好处:提高进程的执行使用率,提高了CPU的使用率

注意:

  1. 在同一个时间点一个CPU中只可能有一个线程在执行
  2. 多线程不能提高效率、反而会降低效率,但是可以提高CPU的使用率
  3. 一个进程如果有多条执行路径,则称为多线程程序
  4. Java虚拟机的启动至少开启了两条线程,主线程和垃圾回收线程
  5. 一个线程可以理解为进程的子任务

2.说说Java中实现多线程的几种方法

Thread对象就是一个线程

创建线程的常用三种方式:

  1. 继承Thread类
  2. 实现Runnable接口
  3. 实现Callable接口(JDK1.5>=)
  4. 线程池方式创建

  通过继承Thread类或者实现Runnable接口、Callable接口都可以实现多线程,不过实现Runnable
接口与实现Callable接口的方式基本相同,只是Callable接口里定义的方法返回值,可以声明抛出异
常而已。因此将实现Runnable接口和实现Callable接口归为一种方式。这种方式与继承Thread方式
之间的主要差别如下。

继承Thread类

实现的步骤:

  1. 创建Thread类的子类
  2. 重写run方法
  3. 创建线程对象
  4. 启动线程

案例代码

package com.bobo.thread;

public class ThreadDemo02 {
   

    /**
     * 线程的第一种实现方式
     *     通过创建Thread类的子类来实现
     * @param args
     */
    public static void main(String[] args) {
   
        System.out.println("main方法执行了1...");
        // Java中的线程 本质上就是一个Thread对象
        Thread t1 = new ThreadTest01();
        // 启动一个新的线程
        t1.start();
        for(int i = 0 ; i< 100 ; i++){
   
            System.out.println("main方法的循环..."+i);
        }
        System.out.println("main方法执行结束了3...");
    }
}

/**
 * 第一个自定义的线程类
 *    继承Thread父类
 *    重写run方法
 */
class ThreadTest01 extends Thread{
   

    @Override
    public void run() {
   
        System.out.println("我们的第一个线程执行了2....");
        for(int i = 0 ; i < 10 ; i ++){
   
            System.out.println("子线程:"+i);
        }
    }
}

注意点:

  1. 启动线程是使用start方法而不是run方法
  2. 线程不能启动多次,如果要创建多个线程,那么就需要创建多个Thread对象

image.png

实现Runnable接口

  在第一种实现方式中,我们是将线程的创建和线程执行的业务都封装在了Thread对象中,我们可以通过Runable接口来实现线程程序代码和数据有效的分离。

Thread(Runnable target)
// 分配一个新的 Thread对象。

实现的步骤:

  1. 创建Runable的实现类
  2. 重写run方法
  3. 创建Runable实例对象(通过实现类来实现)
  4. 创建Thread对象,并把第三部的Runable实现作为Thread构造方法的参数
  5. 启动线程
package com.bobo.runable;

public class RunableDemo01 {
   

    /**
     * 线程的第二种方式
     *     本质是创建Thread对象的时候传递了一个Runable接口实现
     * @param args
     */
    public static void main(String[] args) {
   
        System.out.println("main执行了...");
        // 创建一个新的线程  Thread对象
        Runnable r1 = new RunableTest();
        Thread t1 = new Thread(r1);
        // 启动线程
        t1.start();
		Thread t2 = new Thread(r1);
		t2.start();
        System.out.println("main结束了...");
    }
}

/**
 * 线程的第二种创建方式
 *   创建一个Runable接口的实现类
 */
class RunableTest implements Runnable{
   

    @Override
    public void run() {
   
        System.out.println("子线程执行了...");
    }
}

实现Runable接口的好处:

  1. 可以避免Java单继承带来的局限性
  2. 适合多个相同的程序代码处理同一个资源的情况,把线程同程序的代码和数据有效的分离,较好的体现了面向对象的设计思想

Callable的方式

  前面我们介绍的两种创建线程的方式都是重写run方法,而且run方法是没有返回结果的,也就是main方法是不知道开启的线程什么时候开始执行,什么时候结束执行,也获取不到对应的返回结果。而且run方法也不能把可能产生的异常抛出。在JDK1.5之后推出了通过实现Callable接口的方式来创建新的线程,这种方式可以获取对应的返回结果

package com.bobo.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class CallableDemo01 {
   

    /**
     * 创建线程的第三种实现方式:
     *    Callable方式
     */
    public static void main(String[] args) throws  Exception {
   
        // 创建一个Callable实例
        Callable<Integer> callable = new MyCallable();
        FutureTask<Integer> futureTask = new FutureTask

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

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

相关文章

【微服务】Eureka的自我保护机制

Eureka的自我保护模式正是一种针对网络异常波动的安全保护措施&#xff0c;使用自我保护模式能使Eureka集群更加的健壮&#xff0c;稳定的运行。 在正常情况下&#xff0c;Eureka客户端会定期向Eureka服务器发送心跳&#xff0c;以表明它仍然存活和可用。如果Eureka服务器在配…

你认为嵌入式软件开发的尽头是什么?

嵌入式软件开发的“尽头”是一个富有哲理且多维度的概念&#xff0c;因为它不仅关乎技术发展的极限&#xff0c;还涉及到行业应用、市场需求、技术融合与创新等多个方面。从几个不同的视角来看&#xff1a; 技术极限&#xff1a;从纯技术的角度来看&#xff0c;嵌入式软件开发…

C++ List (带你一篇文章搞定C++中的List类)

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 数据结构习题_LaNzikinh篮子的博客-CSDN博客 初阶数据结构_LaNzikinh篮子的博客-CSDN博客 收入专栏&#xff1a;C_LaNzikinh篮子的博客-CSDN博客 其他专…

0基础带你入门Linux之使用

1.Ubuntu软件管理 回顾一下&#xff0c;我们之前使用su root切换到root模式&#xff0c;使用who 发现为什么显示的还是bd用户呢&#xff1f;为什么呢&#xff1f; 这个who是主要来查看的是我们登录的时候是以什么用户登录的 所以即使我们使用who进行查看的时候显示的还是bd用…

如何扫描试卷去除笔迹?4种方法还原整洁试卷

如何扫描试卷去除笔迹&#xff1f;扫描试卷去除笔迹&#xff0c;作为现代学习管理与评估的革新手段&#xff0c;不仅显著提升了试卷的整洁美观度&#xff0c;更在环保和资源再利用层面发挥了积极作用。它使得试卷的保存、分享与复习变得更加便捷高效&#xff0c;减少了纸质资源…

2024年9月12日美国Embarcadero公司正式发布RAD Studio Delphi/C++ Builder 12.2 雅典

Embarcadero 非常高兴地宣布&#xff0c;从今天开始&#xff0c;RAD Studio 12.2 Athens 以及 Delphi 12.2 和 CBuilder 12.2 可供客户使用。RAD Studio 12.2 Athens 版本提供了我们在 IDE 中的第一次生成式 AI 集成、用于 Web 开发的新模板库、基于 C Win64 Clang 的新编译器和…

【MATLAB源码-第266期】基于Matlab的k-means算法遥感图像分割系统仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 基于K-means算法的图像分割在遥感图像处理中的应用十分广泛&#xff0c;尤其是对于需要自动提取特定区域或目标的场景。遥感图像通常包含了大量的地物信息&#xff0c;不同的地物如水体、建筑物、植被等在遥感图像中会表现出…

电脑的主板,内存条插多少合适?

首先&#xff0c;不是插满4条内存就是最好的。 内存条插得多&#xff0c;确实可以扩充容量&#xff0c;提升性能。但是有些低端的主板配低端CPU&#xff0c;插满4条内存&#xff0c;稳定性下降。这里的稳定性包括供电&#xff0c;单独的内存供电容量等。此时CPU会通过降低内存…

为什么使用 Rust over C++ 进行 IoT 解决方案开发

物联网已成为我们日常生活中不可或缺的一部分&#xff0c;设备也越来越智能。随着该领域的扩展&#xff0c;迫切需要保证这些支持软件的设备的安全性、生产力和效率。因此&#xff0c;Rust 编程语言正在成为 IoT 设备开发人员仅次于 C 的第二大热门选择。本文将探讨为什么 Rust…

《机器学习》周志华-CH7(贝叶斯分类)

7.1贝叶斯决策论 对分类任务而言&#xff0c;在所有相关概率已知的理想情形下&#xff0c;贝叶斯决策论考虑如何基于这些概率核误判损失来选择最优的类别标记。 R ( x i ∣ x ) ∑ j 1 N λ i j P ( c j ∣ x ) \begin{equation} R(x_{i}|x)\sum_{j1}^{N}\lambda_{ij}P(c_{j}…

【C++】vector详解,模拟实现

目录 1. vector的介绍 2. vector的使用 2.1 构造函数 2.2 遍历方式 2.3 reserve与resize 2.4 shrink_to_fit 2.5 insert&#xff0c;erase&#xff0c;find 3. vector模拟实现 3.1 初始结构 3.2 析构函数 3.3 获取容量和元素个数 3.4 扩容reserve 3.5 resize改变…

最新简洁大方的自动发卡网站源码/鲸发卡v11.61系统源码/修复版

源码简介&#xff1a; 最新简洁大方的自动发卡网站源码&#xff0c;它就是鲸发卡v11.61系统源码&#xff0c;它是修复版。 说到鲸发卡系统&#xff0c;鲸发卡系统在发卡圈很多人都知道的&#xff0c;它是市面最好发卡系统之一&#xff0c;操作起来简单得很&#xff0c;界面也…

【数据结构】排序算法---快速排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 递归版本代码实现5.1 hoare版本5.2 挖坑法5.3 lomuto前后指针 6. 优化7. 非递归版本代码实现结语 1. 定义 快速排序是由东尼霍尔所发展的一种排序算法。在平均状况下&#xff0c;排序 n 个项目要 O ( n l o g n ) Ο(nlogn) …

在 Windows 上恢复已删除的 PDF 文件的最佳方法

如果您不小心删除了 PDF 文件或由于系统突然崩溃而无法再找到它们&#xff0c;本指南介绍了恢复已删除文件的最佳方法。 帖子中列出的方法简单、有效且可行。我们在列出它们之前对其进行了测试。 什么是 PDF&#xff0c;Adobe 将未保存的 PDF 存储在哪里&#xff1f; 自从 Ad…

数据清洗-缺失值填充-K-NN算法(K-Nearest Neighbors, K-NN算法)

目录 一、安装所需的python包二、采用K-NN算法进行缺失值填充2.1可直接运行代码2.2以某个缺失值数据进行实战2.2.1代码运行过程截屏&#xff1a;2.2.2填充后的数据截屏&#xff1a; 三、K 近邻算法 (K-Nearest Neighbors, KNN) 介绍3.1 K 近邻算法定义3.2 K 近邻算法的基本思想…

Linux 文件与目录操作命令详解

文章目录 前言创建文件1. touch2. vim 文件内容显示3. cat4. more5. less6. head7. tail 文件&#xff08;目录&#xff09;复制、删除和移动8. cp9. rm10. mv 压缩文件与解压缩11. gzip12. zip 和 unzip 创建目录13. mkdir 删除目录14. rmdir 改变工作目录15. cd16. pwd 显示目…

六、二分搜索-算法总结

文章目录 六、二分搜索6.1 简介6.2 典型实例 -- 二分查找6.2 模板6.3 常见题目6.3.1 搜索插入位置6.3.2 搜索二维矩阵6.3.3 寻找旋转排序中数组中的最小值6.3.4 寻找旋转排序数组中的最小值 II6.3.5 搜索旋转排序数组6.3.6 搜索旋转排序数组 II 总结 六、二分搜索 6.1 简介 给…

Java或者前端 实现中文排序(调API的Demo)

目录 前言1. 前端2. Java 前言 前端 Vue 中的中文排序通常使用 JavaScript 提供的 localeCompare 方法来比较中文字符串 Java 后端可以使用 Collator 类来实现中文排序 1. 前端 在 Vue 中&#xff0c;使用 localeCompare 来实现中文字符串的排序&#xff1a; <template&…

Skyeye 云智能制造 v3.14.5 发布,ERP 商城

Skyeye 云智能制造&#xff0c;采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程&#xff0c;CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…

SAM 2: Segment Anything in Images and Videos

SAM2: 在图像和视频中分割任何内容 作者 Nikhila Ravi, Valentin Gabeur, Yuan-Ting Hu, Ronghang Hu 等 (Meta FAIR) 论文&#xff1a;SAM2: Segment Anything in Images and Videos项目代码&#xff1a;GitHub Repository互动演示&#xff1a;Demo 摘要 SAM2 是一个用于处…