• 线程和线程池 详细讲解


    物理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

  • 相关阅读:
    整理打印PI值
    使用自连接、for xml path('')和stuff合并显示多行数据到一行中(转)
    ThinkPHP+jQuery EasyUI Datagrid查询数据的简单处理
    ThinkPHP学习(三)
    Apache+PHP配置PATHINFO的一个小问题
    ThinkPHP学习(二)
    接口签名工具类
    RSA加密和解密工具类
    kafka项目中踩到的一个坑(客户端和服务器端版本不一致问题)
    自己实现字符串转整数(不使用JDK的字符串转整数的方法)
  • 原文地址:https://www.cnblogs.com/Shunia123/p/10610756.html
Copyright © 2020-2023  润新知