多线程---基础篇(一)

简介: 多线程---基础篇

什么是多线程


多线程指在一个程序内同时运行多个线程。

线程可以理解为轻量级的进程,它是一个基本的CPU执行单元,也是程序执行时的最小单位。一个进程内可以有多个线程同时运行。

相比进程间的切换,线程间的切换开销更小,所以多线程可以有效提升程序的执行效率。

使用多线程主要有以下优点:


  1. 提高应用程序的响应速度
  2. 多线程可以同时执行多个任务,适当使用多线程可以使程序在等待一个线程完成某项任务时继续执行其他线程的任务,从而提高程序的响应速度。


  1. 改善资源利用率
  2. CPU与IO设备等资源在执行线程时如果遇到等待时间,多线程可以使其切换到另一个线程继续执行,减少资源空闲时间,提高资源利用率。


  1. 提高程序结构的模块化
  2. 多线程程序结构更加模块化,每个线程完成一个相对独立的功能模块,这提高了程序的结构化,便于理解和修改。


  1. 并行计算
  2. 多线程可以同时执行运算任务,充分利用多核CPU的优势,减少执行时间。
  3. 总之,合理使用多线程可以让程序执行更高效、响应更迅速,充分利用系统资源。但也需要注意线程安全和死锁等问题。


线程、进程、多线程


任务


比如:同时吃饭、玩手机;同时开车、打电话


多线程


像下图一样:当公路上之后一个车道的时候,所有的车都必须排队进行,效率是比较慢的。那么为了解决这个问题在公路上可以开辟多条车道,这个来往的车辆就可以同步进行。


5700897ad92621c1414c321078d855c5_1bd0d933eb214c1ba77cc7a5c8722b85.png


程序、进程、线程


在操作系统中运行的程序就是进程,比如你的qq、播放器等。

在播放器程序上看视频,同时听到声音、看到图像合字幕,声音、图像、字幕都是线程


726eb720eabfc28b6b6013a8a6bc6478_59e9346f87384d51a55ea53f01a8e5ec.png


程序:指令和数据有序集合,其本身没有任何运行的含义,是一个静态的概念。

进程:是执行程序的一次执行过程,是一个动态概念。是系统资源分配的单位

通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度的单位。


注:很多多线程是模拟出来的,真正的多线程是指多个CPU,即多核,如服务器,如果是模拟出来的多线程,即在一个CPU的情况下,在同一个时间点,CPU只能执行也给代码,因为切换很多,所以就有同时执行的错觉。


线程的三种实现方式创建


线程创建有三种实现方式:继承Thread类、实现Runnable接口、Callable接口


Thread


//创建线程方式1:继承Thread类,重写run方法,调用start开启线程
public class TestTheead1 extends Thread{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码~"+i);
        }
    }
    //主线程
    public static void main(String[] args) {
        //创建一个线程对象
        TestTheead1 testTheead1=new TestTheead1();
        testTheead1.start();//调用start方法开启线程
        for (int i = 0; i < 2000; i++) {
            System.out.println("我在学习多线程~~~~~~"+i);
        }
    }
}


结果:


f968898ac29831cca452c3449c6fad32_a2d8b97918904fa582858f3fd544219f.png


多线程是交替执行的,比如下图:

调用start()方法是交替执行的,也就是创建的线程和main()这个线程之间是并性的,谁先执行是CPU来控制的,线程开启不一定立即执行,由CPU调度执行


0375ca8e5bd5d74845fbf4f7aa262cb4_b1d19581e29e4172b32a17aaabc38301.png


Runnable


//创建线程方法2,实现runnable接口,执行线程需要丢入runnable接口实现类,调用start方法
public class TestThread3 implements Runnable{
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 20; i++) {
            System.out.println("我在看代码~"+i);
        }
    }
    //主线程
    public static void main(String[] args) {
        //创建runnable接口的实现类对象
        TestThread3 testThread3 = new TestThread3();
        //创建线程对象,通过线程对象来开启线程
        Thread thread=new Thread(testThread3);
        thread.start();
        for (int i = 0; i < 2000; i++) {
            System.out.println("我在学习多线程~~~~~~"+i);
        }
    }
}


Thread和Runnable总结


57d20193f67d448a274add28425944ef_327318a5881441f0a1a89a58655cc614.png


相关文章
|
NoSQL 算法 Linux
秋招无望,五个C++项目助你上岸(可以写进简历)
秋招无望,五个C++项目助你上岸(可以写进简历)
|
并行计算 TensorFlow 调度
推荐场景GPU优化的探索与实践:CUDA Graph与多流并行的比较与分析
RTP 系统(即 Rank Service),是一个面向搜索和推荐的 ranking 需求,支持多种模型的在线 inference 服务,是阿里智能引擎团队沉淀多年的技术产品。今年,团队在推荐场景的GPU性能优化上又做了新尝试——在RTP上集成了Multi Stream,改变了TensorFlow的单流机制,让多流的执行并行,作为增加GPU并行度的另一种选择。本文详细介绍与比较了CUDA Graph与多流并行这两个方案,以及团队的实践成果与心得。
|
Windows
mathtype7产品激活密钥最新
MathType是强大的数学公式编辑器,MathType公式编辑器可以说是专门为理科生准备的软件,它可以帮助用户快速的在各种文档中插入符号和公式,不论是简单的公式和符号,还是复杂的都可以非常轻松的输入,并且在与office文档结合使用时,表现的非常完美,是非常好的一款软件,与常见的文字处理软件和演示程序配合使用,能够在各种文档中加入复杂的数学公式和符号,可用在编辑数学试卷、书籍、报刊、论文、幻灯演示等方面,是编辑数学资料的得力工具。
48943 0
|
9月前
|
消息中间件 存储 负载均衡
C 语言多线程编程:并行处理的利剑
C语言多线程编程是实现并行处理的强大工具,通过创建和管理多个线程,可以显著提升程序执行效率,尤其在处理大量数据或复杂计算时效果显著。
CCF推荐A类会议和期刊总结:计算机体系结构/并行与分布计算/存储系统领域
中国计算机学会(CCF)2022年版推荐目录涵盖了计算机体系结构、并行与分布计算、存储系统领域的多个A类会议和期刊。本文汇总了这些顶级资源的全称、出版社、dblp网址及领域。包括《ACM计算机系统汇刊》、《ACM存储汇刊》等期刊,以及ACM PPoPP、USENIX FAST等会议,为研究人员提供了重要学术参考。
12523 64
CCF推荐A类会议和期刊总结:计算机体系结构/并行与分布计算/存储系统领域
|
异构计算
CCF推荐B类会议和期刊总结:(计算机体系结构/并行与分布计算/存储系统领域)
中国计算机学会(CCF)定期发布国际学术会议和期刊目录,为科研人员提供参考。本文总结了计算机体系结构、并行与分布计算、存储系统领域的CCF推荐B类会议和期刊,包括会议和期刊的全称、出版社、dblp文献网址及领域分类。会议涵盖了SoCC、SPAA、PODC等26项重要国际会议,期刊则包括TAAS、TODAES、TECS等9种权威期刊,为相关领域的研究者提供了宝贵的资源。
CCF推荐B类会议和期刊总结:(计算机体系结构/并行与分布计算/存储系统领域)
|
Java Maven 索引
Elasticsearch-Java操作篇
Elasticsearch-Java操作篇
138 0
|
Linux 调度 C++
C++项目实战-高并发服务器详析(一)
C++项目实战-高并发服务器详析(一)
454 0
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析(中)
R语言股票市场指数:ARMA-GARCH模型和对数收益率数据探索性分析
|
存储 缓存 Java
【项目设计】高并发内存池—tcmalloc核心框架学习(一)
【项目设计】高并发内存池—tcmalloc核心框架学习
697 1