java juc 01 进程与线程

进程和线程的概念

并行和并发的概念

线程基本应用

ps :随便写写,今天就是开个新章

对比维度 进程(Process) 线程(Thread)
基本概念 程序运行时的一个实例,用来加载指令、管理内存、管理 IO 进程内部的一条执行路径(指令流),由 CPU 调度执行
包含关系 一个进程可以包含多个线程 线程必须依附于进程存在
调度单位(Java) 资源分配的最小单位 CPU 最小调度单位
资源占有 拥有独立的内存空间、文件句柄、IO 资源等 共享所属进程的资源(内存、文件、IO)
独立性 进程之间基本相互独立 同一进程内线程相互依赖
通信方式 进程通信复杂:IPC、管道、消息队列、网络协议等 线程通信简单:共享内存、共享变量即可
创建/销毁开销 开销大,系统资源消耗多 开销小,更轻量
上下文切换成本 较高(涉及地址空间切换) 较低(共享进程资源)
典型例子 打开多个浏览器窗口 = 多个进程 浏览器一个进程内:渲染线程、网络线程等
Windows 特点 进程更多作为线程的容器,本身不直接执行 真正执行任务的是线程

并行与并发

单核 cpu 下,线程实际还是 串行执行 的。操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows

下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是 同时运行的 。总结为一句话就是: 微观串行,宏观并行

一般会将这种 线程轮流使用 CPU 的做法称为并发, concurrentr 多个任务在同一时间段内交替执行

多核 cpu下,每个 核(core) 都可以调度运行线程,这时候线程可以是并行的。

多个任务在同一时刻真正同时执行

应用

以调用方角度来讲,如果

需要等待结果返回,才能继续运行就是同步

不需要等待结果返回,就能继续运行就是异步

多线程可以让方法执行变为异步的(即不要巴巴干等着)比如说读取磁盘文件时,假设读取操作花费了 5 秒钟,如

果没有线程调度机制,这 5 秒 cpu 什么都做不了,其它代码都得暂停...

比如在项目中,视频文件需要转换格式等操作比较费时,这时开一个新线程处理视频转换,避免阻塞主线程

tomcat 的异步 servlet 也是类似的目的,让用户线程处理耗时较长的操作,避免阻塞 tomcat 的工作线程

ui 程序中,开线程进行其他操作,避免阻塞 ui 线程

java 复制代码
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class tttest {

    public class ParallelComputeDemo {

        public static void main(String[] args) throws Exception {

            // 1. 创建线程池(CPU核心数)
            ExecutorService pool = Executors.newFixedThreadPool(
                    Runtime.getRuntime().availableProcessors()
            );

            long start = System.currentTimeMillis();

            // 2. 并行执行三个任务
            CompletableFuture<Integer> task1 =
                    CompletableFuture.supplyAsync(() -> compute(10), pool);

            CompletableFuture<Integer> task2 =
                    CompletableFuture.supplyAsync(() -> compute(11), pool);

            CompletableFuture<Integer> task3 =
                    CompletableFuture.supplyAsync(() -> compute(9), pool);

            // 3. 汇总(等待所有任务完成)
            Integer result = CompletableFuture.allOf(task1, task2, task3)
                    .thenApply(v -> task1.join() + task2.join() + task3.join())
                    .get();

            long end = System.currentTimeMillis();

            System.out.println("最终汇总结果 = " + result);
            System.out.println("总耗时 = " + (end - start) + "ms");

            pool.shutdown();
        }

        // 模拟计算任务
        private static int compute(int time) {
            try {
                Thread.sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return time;
        }
    }

}

最终汇总结果 = 30

总耗时 = 14ms

  1. 单核 cpu 下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用

cpu ,不至于一个线程总占用 cpu,别的线程没法干活

  1. 多核 cpu 可以并行跑多个线程,但能否提高程序运行效率还是要分情况的

有些任务,经过精心设计,将任务拆分,并行执行,当然可以提高程序的运行效率。但不是所有计算任务都能拆分也不是所有任务都需要拆分,任务的目的如果不同,谈拆分和效率没啥意义

  1. IO 操作不占用 cpu,只是我们一般拷贝文件使用的是【阻塞 IO】,这时相当于线程虽然不用 cpu,但需要一直等待 IO 结束,没能充分利用线程。所以才有后面的【非阻塞 IO】和【异步 IO】优化
相关推荐
疯狂打码的少年3 小时前
【数据库技术】关系模型基本概念(关系/属性/元组/键)
java·服务器·数据库·笔记
OPEN-F4 小时前
C++进阶教程:继承与多态
开发语言·c++
Mr数据杨5 小时前
【Codex】用学生入学评估模块建立新生能力画像
android·java·javascript·django·codex·项目开发
2601_962056235 小时前
Spring Boot 入门 与 无法解析符号 springframework 的解决
java·spring boot·后端
luj_17685 小时前
大律师考核应重能力与科技素养
c语言·开发语言·c++·经验分享·算法
Thomas21436 小时前
Java scala 数组 链表
java·链表·scala
亚历克斯神6 小时前
低代码与 AI 的融合趋势——从可视化搭建到自然语言生成应用
java·spring·微服务
学长毕业设计6 小时前
基于SpringBoot的瑜伽馆网站的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
一嘴一个橘子6 小时前
nginx 常用命令(在 nginx 目录下执行)
java
leonkay7 小时前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发