美文网首页
Java 线程

Java 线程

作者: 九世的猫 | 来源:发表于2020-10-27 17:12 被阅读0次

    线程

    1.线程的相关概念
    2.线程的创建和启动 ★
    3.线程的停止
    4.线程的常见方法(Thread)
    5.线程的生命周期 ★
    6.线程的同步
    7.线程的通信
    

    线程的相关概念

    概念

    程序:为了让计算机完成某个特定的功能,编写的一系列有序指令的集合。
    实则是一段静止的代码段

    进程:正在运行的程序,它有自己的生命周期

    线程:轻量级的进程。一个进程可以划分为若干个执行单位,每个执行单位可以看做是一个线程
    一个进程可以包含多个线程
    比如:正在运行的qq

    它也有自己的生命周期
    

    单线程:一个进程中,在同一个时刻,只能运行一个线程,必须等待该线程执行结束,其他线程才能开始执行

    多线程:一个进程中,在同一个时刻,可以同时运行多个线程

        单核cpu: 仅仅只是貌似 “同时”
        多核cpu: 有可能出现真正“同时”
        
        比如:qq 同时打开多个线程,打开qq新闻、打开qq聊天窗口
    

    多线程的好处

    1、有效的占用了cpu的空闲时间,从一定程度上提高了效率
    2、提高了用户的体验性
    3、将一个复杂的进程拆分成若干个小的线程,提高代码的分离性和维护性
    

    线程的创建和启动

    方式一:继承Thread

    定义线程类:
    class MyThread extends Thread{

        public void run(){
    
            //编写新线程要执行的任务体
        }
    
    }
    

    创建新线程,并启动
    new MyThread().start();

    方式二:实现Runnable

    定义任务类:
    class MyRunnable implements Runnable{

        public void run(){
            //编写新线程的任务体
        }
    }
    

    创建新线程,并启动
    new Thread(new MyRunnable()).start();

    两种方式的对比★

    1、方式二避免了单继承的局限性,使用更加灵活
    
    2、方式二更适合处理多线程共享资源的情况
    

    线程的停止

      1.stop 已经过时
      2.Interrupt 只能中断睡眠、等待这些状态,会抛出InterruptedException异常,并没有真正的结束线程
      3.采用通知的方法 ★
      
        步骤1:让需要停止的线程中添加一个循环标记,默认值为true
        步骤2:让需要停止的线程中添加一个公共的set方法,用于更新循环标记
        步骤3:需要停止该线程时,调用set方法即可
    

    线程的常见方法 【了解】

    currentThread 获取当前线程对象     //Thread.currentThread().getName();
    setName设置线程名称
    getName获取线程名称
    setPriority设置线程优先级1——10
    getPriority获取线程优先级
    sleep休眠
    interrupt中断休眠状态
    yield线程的礼让
    join线程的插队
    setDaemon设置守护线程
    

    线程的生命周期

    线程的同步

    理解

    线程的同步实际上就是线程的安全问题。如果多个线程处理共享资源时,出现了数据安全问题,称为线程的同步问题!
    

    线程的同步如何发生的?

    当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误
    

    如何避免线程的同步问题?

    对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行
    
    借鉴:火车厢的洗手间的上锁的方式
    

    线程的同步的实现方式 ★

    对象+synchronized  搭配使用
    

    方式一:同步代码块

    synchronized(锁对象){
    
        //需要上锁的代码(同步的代码)
    
    }
    

    方式二:同步方法

    public synchronized 返回类型 方法名(参数列表){
    
        //需要上锁的代码(同步的代码)
    
    }
    
    
    
    注意:
    
    普通的同步方法,锁对象是:this
    
    静态的同步方法,锁对象是:当前类.class
    

    要求:
    多个线程使用的锁对象必须是同一个!!!

    线程的同步前提

    1、多线程
    2、有共享资源&线程的任务体中有对共享资源处理语句
    

    使用同步的落地步骤 ★

    1、先分析需要上锁的代码
    2、分析需要同步代码块还是同步方法
    3、检测多线程使用的锁对象是否为同一个!!!
    

    线程的死锁

    发生原因:多个线程都需要用到多把锁,每一个线程都需要对方线程的锁对象,如果多个线程互不相让,导致死锁问题
    

    线程的通信

    理解

    线程的通信也就是 线程之间的 “交流”,也就是通过一定的方法,实现线程的控制!

    相关的API ★

    一、wait
    语法:

    锁对象.wait();
    

    特点:

    1、让当前线程等待,直到其他线程调用了该锁对象的notify或notifyAll方法为止,否则将一直等待
    2、wait的调用 必须在同步的前提下
    
    3、wait的调用 会导致锁的释放
    4、如果等待结束也就是被唤醒后,则继续从断点处往下执行!
    

    二、notify和notifyAll

    语法:锁对象.notify()|notifyAll();

    特点:

    1、notify:唤醒当前锁对象下等待的单个线程。优先级较高的优先唤醒,如果优先级一样,则随机
       notifyall:唤醒当前锁对象下所有等待的线程
    
    2、notify和notifyAll的调用,必须在同步的前提下
    

    注意:

    wait、notify、notifyAll和当前同步代码的锁对象都必须是同一个!否则报异常!!!!
    

    相关文章

      网友评论

          本文标题:Java 线程

          本文链接:https://www.haomeiwen.com/subject/xxwamktx.html