线程和线程池 详细讲解
物理CPU、核 和 线程之间的关系
物理CPU:是指硬件的核心数,指这台计算机有两个CPU。
逻辑CPU:是逻辑上的,简单理解为在逻辑上模拟出来的核心数,即效果是 物理1个CPU 模拟出逻辑CPU,上图中是一个CPU模拟出两个,相当于两个CPU的效果。
CPU程数:是指在同一时刻设备能并行执行的线程数, 线程数=物理CPU * 逻辑CPU。即代表在此时此刻这个时间点,可以同时执行的线程数为4。
综述所述,本台电脑为双核4线程:内核2个,每个内核在模拟出2个逻辑处理器。
单核单线程: 在同一时刻运行一个线程。
单核双线程: 在同一时刻运行2个线程。
双核双线程: 在同一时刻运行2个线程。
双核多线程: 在同一时刻运行多个线程。
一个CPU线程只能在一个CPU上运行,一个CPU线程在同一时刻只能执行单一Java程序。
Java多线程并不是由于cpu线程数为多个才称为多线程,当Java线程数 >(大于) cpu线程数,操作系统使用时间片机制,采用线程调度算法,频繁的进行线程切换。多线程是程序设计的逻辑成概念,它是进程中并发运行的一段代码,多线程实现线程之间的切换。
线程是操作系统最小的调度单位,进程是资源(比如:内存)分配的最小单位。
进程可能有多个子任务,比如微信要接受消息,发送消息,这些子任务就是线程。资源分配给进程,线程共享进程资源。
串行,并行 和 并发
串行:多个任务,一个任务执行完成后再执行另外一个,例如 吃完饭再看球赛。串行即线程同步。
并行:每个线程分配给独立的核心,线程同时运行。例如 一边吃饭一边看球赛。常见于不同的线程中。
并发:多个线程在单个核心运行,同一时间一个线程运行,系统不停切换线程,看起来像同时运行,实际上是线程不停切换。例如 一会跑去食厅吃饭,一会跑去客厅看球赛。则并发即线程异步。
线程同步和线程异步之间的区别
同步:Sync,所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作。
异步:Async,异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。当这个调用完成后,一般通过状态、通知和回调来通知调用者。对于异步调用,调用的返回并不受调用者控制。
根据定义,Java中所有方法都是同步调用,应为必须要等到结果后才会继续执行。我们在说同步、异步的时候,一般而言是特指那些需要其他端协作或者需要一定时间完成的任务。
简单来说,同步就是必须一件一件事做,等前一件做完了才能做下一件事。
举个例子简单说明下两者的区别:
同步:火车站多个窗口卖火车票,假设A窗口当卖第288张时,在这个短暂的过程中,其他窗口都不能卖这张票,也不能继续往下卖,必须这张票处理完其他窗口才能继续卖票。直白点说就是当你看见程序里出现synchronized这个关键字,将任务锁起来,当某个线程进来时,不能让其他线程继续进来,那就代表是同步了。
异步:当我们用手机下载某个视频时,我们大多数人都不会一直等着这个视频下载完,而是在下载的过程看看手机里的其他东西,比如用qq或者是微信聊聊天,这种的就是异步,你执行你的,我执行我的,互不干扰。比如上面卖火车票,如果多个窗口之间互不影响,我行我素,A窗口卖到第288张了,B窗口不管A窗口,自己也卖第288张票,那显然会出错了。
当java程序启动线程异步时,程序会不停的创建新线程,会造成资源的浪费,一般会使用线程池来管理线程的数量。因此可简称异步线程池。
线程异步和多线程之间的关系
异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。即多线程实现异步调用
常见的异步实现框架 实例: 使用设计模式 “生产者和消费者”,这个链接更加详细“生产者和消费者 设计模式实例”
线程池的概念
线程池的概念:“线程池_百度百科”
线程池:一个池中配置 固定个数目的 线程。即一个线程池中可以配置最多5个线程。
java并发编程即线程异步编程时使用线程池的概念。线程池底层实现详解:“java并发编程:线程池的使用”
线程池应用实际案例访问 https://www.cnblogs.com/iceworld520/p/7066388.html
多线程的异步执行方式,使用线程池 https://www.cnblogs.com/superfj/p/7544971.html