合肥网站优化技术,wordpress 添加版权信息,网站怎么做推广和宣传,wordpress下载远程图片大小进程和线程的概念 并行和并发的概念 线程基本应用ps #xff1a;随便写写#xff0c;今天就是开个新章对比维度进程#xff08;Process#xff09;线程#xff08;Thread#xff09;基本概念程序运行时的一个实例#xff0c;用来加载指令、管理内存、管理 IO进程内部的一…进程和线程的概念并行和并发的概念线程基本应用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 线程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. 并行执行三个任务 CompletableFutureInteger task1 CompletableFuture.supplyAsync(() - compute(10), pool); CompletableFutureInteger task2 CompletableFuture.supplyAsync(() - compute(11), pool); CompletableFutureInteger 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总耗时 14ms1. 单核 cpu 下多线程不能实际提高程序运行效率只是为了能够在不同的任务之间切换不同线程轮流使用cpu 不至于一个线程总占用 cpu别的线程没法干活2. 多核 cpu 可以并行跑多个线程但能否提高程序运行效率还是要分情况的有些任务经过精心设计将任务拆分并行执行当然可以提高程序的运行效率。但不是所有计算任务都能拆分也不是所有任务都需要拆分任务的目的如果不同谈拆分和效率没啥意义3. IO 操作不占用 cpu只是我们一般拷贝文件使用的是【阻塞 IO】这时相当于线程虽然不用 cpu但需要一直等待 IO 结束没能充分利用线程。所以才有后面的【非阻塞 IO】和【异步 IO】优化