• Java 多线程


    电脑中真正执行的都是线程

    但是我们看到的都是进程

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

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

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

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

    CPU能同时运行多个线程吗?  不能!

    一个CPU在同一个时间点,只能运行一个线程!

    但是电脑的运行速度太快,我们肉眼无法分辨,我们感觉是在同一时间点执行的!

    生活中的场景:

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

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

    多线程的优点:

    01.充分利用CPU的资源

    02.提升用户的体验

    代码实现多线程的方式:

    01.继承Thread类

    02.实现Runnable接口

    03.实现Callable接口

    run()和start()的区别

    start()

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

    02.不代表立即执行线程

    03.底层会调用run()

    run()

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

    02.就是一个普通方法

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

    线程的生命周期

    01.新生状态

    MyThread  t1=new MyThread();     public class MyThread extends Thread

    02.就绪状态

    t1.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()

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

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

    5.线程的中断状态

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

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

    03.interrupted:清除中断状态

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

    并发:

    生活中===》 春秋季节是我们感冒的高发期!

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

    例子:

    春节购买车票:

    1.张三在A窗口正在购买 12车厢12下铺

    2.李四在B窗口正在购买 12车厢12下铺

    3.王五在12306网站上正在购买 12车厢12下铺

    4.赵六在12306网站上正在购买 12车厢12下铺

    问题:

    1.有几张 12车厢12下铺                    ===》只有一张

    2.有几个人能抢到12车厢12下铺      ===》只有一人

    解决办法:

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

    同步(synchronous):  阻塞 

    一个线程在去执行一个操作的时候,若这个操作需要一些时间才能返回,那么当

    前线程和其他的线程都必须等待!

    操作返回结果之后当前线程可以继续执行后续操作!

    /**
    * 在多个线程并发访问run()
    * 只有一个线程能进入synchronized同步代码块/同步代码方法,
    * 只有当这个线程执行完毕,出来之后,其他线程才能进入
    */

    异步(asynchronous) 非阻塞

    一个线程在去执行一个操作的时候,若这个操作需要一些时间才能返回, 

    当前线程不需要等待,可以去做其他事情!

    服务员点餐,不会一直守在我们餐桌旁!

    注意点:

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

    02.当一个线程访问synchronized代码块或者方法的时候,其他线程等待,其他synchronized

        代码块也会被锁定!

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

    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.守护线程永远不要访问资源!!!因为守护线程随时都可能销毁!

  • 相关阅读:
    给div添加disabled属性
    11个让你吃惊的 Linux 终端命令
    在 Linux 平台中调试 C/C++ 内存泄漏方法(转)
    在压缩话单中过滤指定IP的一个小脚本
    过滤IP地址的正则表达式
    【转】网络编程知识
    linux下软链接与硬链接及其区别
    函数式编程入门教程(转)
    suricate学习笔记1--初步认识(转)
    lsof命令详解(转)
  • 原文地址:https://www.cnblogs.com/s10-/p/8243226.html
Copyright © 2020-2023  润新知