• 【线程的重要性】【线程和进程的区别】【多线程的运行优势,对比运行时间System.nanoTime();】


    @TOC

    2) ***为啥要有线程(线程的重要性)

    在这里插入图片描述

    • 首先, “并发编程” 成为 “刚需”
      单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程(多线程编程)能更充分利用多核 CPU 资源.
      有些任务场景需要 “等待 IO”, 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程
    • 其次, 虽然多进程也能实现 并发编程, 但是线程比进程更轻量
      创建线程比创建进程更快.
      销毁线程比销毁进程更快.
      调度线程比调度进程更快.
    • 最后, 线程虽然比进程轻量, 但是人们还不满足, 于是又有了 “线程池”(ThreadPool) 和 “协程”(Coroutine)

    3) ***进程和线程的区别(面试题)

    1. 包含
    2. 区别(轻量,创建快,销毁快)
    3. 优势
    4. 优势的原因
      在这里插入图片描述

    1.4 多线程的优势-增加运行速度

    可以观察多线程在一些场合下是可以提高程序的整体运行效率的。

    • 使用 System.nanoTime() 可以记录当前系统的 纳秒 级时间戳.
    • serial 串行的完成一系列运算. concurrency 使用两个线程并行的完成同样的运算.

    System.nanoTime();

    public class ThreadAdvantage {
        // 多线程并不一定就能提高速度,可以观察,count 不同,实际的运行效果也是不同的
        private static final long count = 10_0000_0000;
        public static void main(String[] args) throws InterruptedException {
            // 使用并发方式
            concurrency();
            // 使用串行方式
            serial();
       }
        private static void concurrency() throws InterruptedException {
            long begin = System.nanoTime();
            
            // 利用一个线程计算 a 的值
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    int a = 0;
                    for (long i = 0; i < count; i++) {
                        a--;
                   }
               }
           });
            thread.start();
            // 主线程内计算 b 的值
            int b = 0;
            for (long i = 0; i < count; i++) {
                b--;
           }
            // 等待 thread 线程运行结束
            thread.join();
            
            // 统计耗时
            long end = System.nanoTime();
            double ms = (end - begin) * 1.0 / 1000 / 1000;
            System.out.printf("并发: %f 毫秒%n", ms);
       }
        private static void serial() {
            // 全部在主线程内计算 a、b 的值
            long begin = System.nanoTime();
            int a = 0;
            for (long i = 0; i < count; i++) {
                a--;
           }
            int b = 0;
            for (long i = 0; i < count; i++) {
                b--;
           }
            long end = System.nanoTime();
            double ms = (end - begin) * 1.0 / 1000 / 1000;
            System.out.printf("串行: %f 毫秒%n", ms);
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    并发: 399.651856 毫秒
    串行: 720.616911 毫秒
    
    • 1
    • 2

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    基于人脸5个关键点的人脸对齐(人脸纠正)
    ubuntu18.04安装mysql5.7并配置数据存储路径
    IE11 使用的 DOM API (MutationObserver)
    【Python】高级变量类型
    USB2.0 EMC标准设计
    二十三种设计模式(待更)
    ROS点云的Pointpillars实时目标检测
    Vue框架快速上手
    golang 中的 cronjob
    青岛建筑模板厂家有哪些?
  • 原文地址:https://blog.csdn.net/m0_63571404/article/details/127668802