zoukankan      html  css  js  c++  java
  • 多线程总结知识点

    多线程:
     * 计算机程序执行原理
     * CPU(寄存器,控制器,运算器),内存,硬盘,光盘
     * 程序,进程,线程
     * 程序:就是指我们写的保存在硬盘当中的静态文件叫程序
     * 进程:程序被加载进内存,准备或者正在运行的,就叫进程
     * 线程:就是程序中不同的执行路径
     *
     * 进程:只要程序加载了,就会在操作系统注册一个进程号(PID)
     *   
     *   程序代码,在没有被调用之前,都是以静态文件方式保存在硬盘中的,我们调用的时候,就会从硬盘载入到内存中
     *      这个时候就认为开启了一个进程
     *      进程是一个操作系统的概念
     *
     *  线程:当我们程序开始执行的时候,就是java中main()开始执行,在栈内存开辟main()栈帧的时候,就是开启了一个线程
     *   一个线程就是里面的一个栈和链式栈帧,一个栈帧就对应一个方法
     *   cpu时间片:Ghz:一秒钟一亿次,把5次执行的时间当成一个基本单位,这5次执行的时间就是一个时间片
     *   然后,给每个进程不同的时间执行,也许相同哦,谁来决定是操作系统决定的
     *   操作系统靠什么来决定:靠的是写程序的时候,给进程指定的程序优先级
     *   为什么有多线程?
     *   人的需求,可以多线程解决
     *   因为有多核CPU,需要提高程序的执行效率
     *
     *   一切皆对象,那就是一切皆类

     /**
     * 创建线程的第一种方式
     *    第一步:继承java.lang.Thread;
     *    第二步:重写run(),为什么要重写,因为run()就相当于新线程中的main(),是程序执行的起点和终点
     *
     *    三个要点:
     *      线程的定义:程序不同执行路径,从代码的角度就是一个类,从内存的角度就是一个新的栈,也就是一个新的栈帧链表
     *
     *      线程必须要先启动:start();
     *
     *      一旦开启多线程,这个时候,说代码是从左到右,从上到下执行这句话就不准确了,因为,我们开启了两个线程,在每个线程的内部,仍然是从上到下,从左到右,但是线程之间的代码,没有固定的先后顺序,他们执行的先后顺序是不确定的,和cpu操作系统和我们的设置都有关

      *  第二种方法:
     *  创建了一个Thread,实现java.lang.runnable,并实现了接口的run()方法
     *  并且调用start();
     *  不过不调用run();相当于单线程
     *  启动一个线程只能是,Thread类的start();
     *
     *  创建新线程有两种方法,但是启动只有一种方法,Thread的start();

     /** 线程的生命周期:
     *      我们的内存分析图,分析了一下单线程程序的生命周期,本质是main()线程所在的栈生命周期,说白了,也就是main()生命周期
     *  非主线程的生命周期:
     *      run()本质就是run()所在的栈的生命周期,也就run()方法的生命周期.
     *      创建/激活
     *      就绪
     *      运行--执行/不执行
     *      阻塞
     *      复活
     *      死亡
     *
     * 线程类的常用方法:
     *  setName();给线程取名字
     *      不设置的话是Thread-0,依次累加
     *  getName();获得当前线程的名字
     *  static currentThread():获得当前线程的内存地址
     *  static sleep():让当前的线程睡眠指定的毫秒数
     *
     *  setPriority():设置线程的优先级,
     *      java中线程的优先级有0-10 11个级别
     *      win当中是1-7 7个优先级
     *      Unix:2^31;
     *  MIN_PRIORITY : 1
     *  MAX_PRIORITY : 10
     *  NORM_PRIORITY : 5

         优先级的等级默认是5级

     线程的合并:
       对象名.join();//当有join()的时候,谁调用的就先输出谁的,相当于方法的调用,不是线程的问题了,变成了单线程问题,又按照从上往下执行
    线程的让位:
       Thread.yield();
     *    1  这是一个静态方法,意味着即使用对象调用他,他也会低层转化为类名调用,听到的也是当前类偶在的线程,也就是说在那个类中调用,就停止那个类的线程
     *    2 给同一个优先级的线程让位,不同优先级的不让位
     *    3 和sleep()方法相同,那个线程调用就停止那个类的线程,但是没时间,不固定,只是让出当前这个时间片,下一个时间片让不让另说
     *    现成的默认优先级:
     *       子线程默认继承父类的优先级
     获取优先级:
     getPriority():调用这个方法,返回的是获得的优先级的等级数

    先写一些基本的知识点和方法,尤其是前面的定义对多线程的理解很有帮助,只有理解了定义,才能更深一步的了解多线程,以后总结了更多的知识会即使和大家分享,希望对大家有帮助!

  • 相关阅读:
    左转弯待转区,什么时候能进,什么时候不能进?
    吵架最激烈不过一分钟,而那一分钟你说出的话,是你用一百分钟都弥补不回来的。
    2017年1月14 15开车总结 英西
    2016年12月17 18 练车总结
    有时候为了方便sql语句的对比和查询,我们可以使用declare来定义变量 上下篇的问题
    EF中一对多的关系中,用单字段保存ID拼接字符串
    美行Thinkpad八通道快捷入口
    使用sqlserver的游标功能来导数据的常见写法
    JMeter教程01-下载和安装
    Windows无法安装到GPT分区形式磁盘的解决办法
  • 原文地址:https://www.cnblogs.com/xrmqbl804915256/p/4796352.html
Copyright © 2011-2022 走看看