zoukankan      html  css  js  c++  java
  • 线程

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

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

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

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

        例如:QQ中,我们可以开多个窗口,跟不同的朋友聊天!

    CPU不能同时运行多个线程,一个CPU在同一时间点,只能运行一个线程!但是电脑的运行速度太快,我们肉眼无法分辨,我们感觉是在同一时间点执行的!

    生活中的场景:

             场景1:现在地铁站有一个进站口,现在有10名旅客进站    排队 等待 ====》单线程

             场景2:现在地铁口有10个进站口,现在有10名旅客进站   直接进站===》多线程

    多线程的优点

           01.充分利用CPU的资源

           02.提升用户的体验

    代码实现多线程的方式

            01.继承Thread类

            02.实现Runnable接口

            03.实现Callable接口

    线程的生命周期

            01.新生状态

                 MyThread   t1   =   new   MyThread();  [public  class MyThread extendsThread]

             02.就绪状态

                  t1.start();

             03.运行状态

                  run();

              04.阻塞状态

                  sleep(); , wait(); , yield(); ,  join();

               05.死亡状态

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

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

    run() 和start()的区别:

              start()

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

                     02.不代表立即执行线程

                     03.当CPU分配其时间片时,底层会调用run()方法

              run()

                     01.CPU分配时间片时,线程的真正运行

                     02.就是一个普通的方法

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

     线程的调度  :

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

    1.线程的优先级setPriority()

      优先级越高 代表获取CPU资源的概率越高!并不代表一定高或者一定执行!

    2.join()

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

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

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

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

    wait()是Object类中的方法!

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

          01.其他的线程无需等待

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

    4.yield()

          线程的礼让,也是一种概率问题!

          线程t1让t2先执行,t2有可能不接受,所以还是t1执行

    5.线程的中断状态

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

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

           03.interrupted: 清楚中断状态

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

    并发

        程序中==》在同一个时间点,N个线程访问同一个资源,会引发线程不安全问题!

        解决办法: 同步代码块和同步代码方法   synchronized 给线程上锁

    同步(synchronous): 阻塞

        一个线程在去执行一个操作的时候,若这个操作需要一些时间才能返回,那么当前线程和其他的线程都必须等待!操作返回结果之后当前线程可以继续执行后续操作!

    异步(asynchronous): 非阻塞

     一个线程在去执行一个操作的时候,若这个操作需要一些时间才能返回,当前线程不需要等待,可以去做其他事情!

    注意点

        01.在同一时间点,只有一个线程能进入synchronized修饰的方法或者代码块

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

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

    Runnable 和 Callable的区别(经典面试题):

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

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

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

      03.涉及了Future思想

             有5个人在排队买票: 每个人买票需要5分钟!
             最后一个人需要等待20分钟!
             中途一旦有人离队,需要重新排队!
        
            现在使用Future思想!
            有5个人在排队买票: 每个人买票需要5分钟!
            最后一个人需要等待20分钟!
            最后一个人可以在20分钟之内去做其他事情,20分钟之后 会有人通知他,让他回来!

    线程的分类

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

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

    注意事项

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

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

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

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

            04.守护线程永远不要访问资源!!!因为守护线程随时都可能销毁

  • 相关阅读:
    Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)
    StringBuffer和StringBuilder使用方法比較
    python 多线程编程
    八大排序算法总结
    腾讯面试
    顶尖的个人作品集站点设计赞赏
    MATLAB新手教程
    ThreadPoolExecutor使用介绍
    linux diff具体解释
    Android借助Application重写App的Crash(简易版)
  • 原文地址:https://www.cnblogs.com/liutianci/p/8183034.html
Copyright © 2011-2022 走看看