• 多线程


    电脑中真正执行的是线程!但我们看到的都是进程!

    进程:是由一个或N个线程组成的!

    线程:CPU调度和分配的基本单位!

    多线程:在同一个进程中,同时(感觉)运行多个线程,来完成不同的工作!

    多线程的优点:01.充分利用CPU的资源

              02.提升用户的体验

    代码实现多线程的方式:

    1.继承Thread类

    2.实现Runnable接口

    3.实现Callable接口

    run()和start()的区别:

      start()

        01.是启动线程,是Thread类中的方法

        02.不代表立即执行线程

        03.底层会调用run()

      run()

        01.CPU分配时间片给线程是,线程真正执行

        02.就是一个普通方法

        03.run()写的内容 称之为 线程体

    线程的生命周期:

      01.新生状态  new

      02.就绪状态  start();

      03.运行状态  run();

      04.阻塞状态

        sleep();wait();yield();(礼让的线程处于就绪状态)join();

      05.死亡状态

        001.正常死亡 run()执行完毕

        002.异常死亡 run()执行过程中出现异常,终止运行

    线程的调度:

      按照我们制定的方式,给多个线程设置CPU的使用权

    1.线程的优先级setPriority

      优先级越高 代表获取CPU的概率越高 并不代表一定执行

    2.join()

      让新的线程加入进来,新线程执行完毕之后,其他线程才能执行!

    3.sleep(long ms)  Thread类中方法

        01.线程休眠,占着CPU资源不放!其他线程都无法获取CPU资源!必须等待!

        02.long ms指的是在多长时间之后,进入就绪状态!

      wait()是Object类中的方法!

      线程wait()的时候,会释放占用的CPU资源!

        01.其他的线程无需等待!

        02.必须使用notify唤醒才能进入就绪状态!

    4.yield()

      线程的礼让,概率问题,可能礼让不成功。

    5.线程的终止

      01.Interrupt:只是设置线程的中断状态,不是终止线程!线程还会继续执行!

      02.isInterrupted:来判断线程是否是中断状态

      03.Interrupted:清楚中断状态

      04.执行了wait或sleep,会默认清除中断状态

    并发:synchronized

      同步代码块和同步代码块方法 synchronized 给线程上锁

      同步(synchronous阻塞):一个线程在执行操作时,其他线程必须等待!

      异步(asynchronous非阻塞):一个线程在执行操作时,其他线程无须等待!

    注意点:

      1.同一个时间只有一个线程能进入synchronized修饰的代码块或方法

      2.当一个线程访问synchronized代码块或者方法的时候,其他的线程等待,其他synchronized代码块也会被锁定!

      3.当一个线程访问synchronized代码块或者方法的时候,其他的线程可以访问非synchronized修饰的代码块或方法!

    Runnable和Callable的区别

      01.Runnable接口中只有一个run()没有返回值 没有声明异常

       Callable接口中只有一个call()有返回值 有声明异常

      02.Callable中的call()返回值我们一般使用Future接口来接收

      03.涉及了Future思想

    线程的分类

      用户线程:User Thread 默认我们创建的线程就是!

      守护线程:Daemon Thread 为其他线程提供服务的!GC线程,需要我们设置

      注意事项:

        01.默认我们创建的线程就是用户线程!

        通过Thread类中的setDaemon(ture)可以转换成守护线程

        02.只要有用户线程存在,程序就不会终止,所有用户线程都执行完毕后,程序会结束所有守护线程!LVM停止工作!

        03.setDaemon(true)必须在start()之前

        04.守护线程永远不会访问资源!

  • 相关阅读:
    pytest实际编码中特殊问题的解决
    python+locust性能测试实例
    python使用eval动态调用函数及其在测试用例中断言的应用
    python中列表生成式的两种用法
    pycharm中的Terminal无法使用git命令
    ruamel.yaml的使用
    pip安装模块失败如何解决
    locust的setup等相关函数的使用
    python模块-optparse(解析命令行参数)
    (转)locust源码目录结构及模块作用
  • 原文地址:https://www.cnblogs.com/dongfengpo/p/8167003.html
Copyright © 2020-2023  润新知