zoukankan      html  css  js  c++  java
  • 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.守护线程永远不要访问资源!!!因为守护线程随时都可能销毁!

  • 相关阅读:
    第二十一章流 1流的操作 简单
    第二十章友元类与嵌套类 1友元类 简单
    第十九章 19 利用私有继承来实现代码重用 简单
    第二十章友元类与嵌套类 2嵌套类 简单
    第十九章 8链表类Node 简单
    第二十一章流 3用cin输入 简单
    第十九章 10 图书 药品管理系统 简单
    第十九章 11图书 药品管理系统 简单
    第二十一章流 4文件的输入和输出 简单
    第十九章 12 什么时候使用私有继承,什么时候使用包含 简单
  • 原文地址:https://www.cnblogs.com/s10-/p/8243226.html
Copyright © 2011-2022 走看看