• Java线程


    线程

      线程是系统调度的基本单元,每当创建一个进程时,会有许多的线程,也叫轻量级进程,在一个进程中拥有多个线程,各自都有自己的计数器,堆和局部变量属性,并且能够分享内存变量.

     为什么要使用多线程

      1.更多的处理器核心

      2.更快的响应时间

      3.更好的编程模型

    优先级

      线程优先级决定了线程需要多或少分配一些处理器资源的线程属性,通过priority来控制优先级,范围从1-10,在线程构建SetPriority(int)方法来修改优先级,默认为5.

    线程的运行状态

     

    状态名称 说明
    NEW 初始状态,线程被构建,但还没有构建START()
    RUNNABLE 运行状态,JAVA线程将操作系统中的就绪和运行,统称"运行中"
    BLOCKED 阻塞状态,线程阻塞与锁
    WAITING 等待状态,线程进入等待状态
    TIME_WAITING 超时等待状态
    TERMINATED 终止状态

    在线程优先级中,JPS可以发现在自身的生命周期中,并不是固定的处于某个状态,而是随着代码执行在不同的状态之间切换

    1-1线程运行状态

    Daemon线程

      支持型线程,主要作用于程序后台调度以及支持性工作,当JVM不存在非DAEMON线程时,JVM将会退出,通过THREAD.SETDAEMON(TRUE)设置DAEMON线程

      !main线程随着daemoned方法之后MAIN终止.

    Boot And Stop

      理解中断

      interrupt()对其进行中断,线程通过检查自身是否中断进行响应,也可以调用静态方法Thread.interrupted()对当前线程终端标识位进行复位.

    过期的STOP(),RESUME(),SUSPEND()

      死锁导致不建议使用,suspend()方法在调用时不会释放已被占有的资源,而是占有资源进入休眠状态,stop()在终结线程不会保证线程正常释放,所以会导致程序工作在不确定状态中

    Volatile

        用来修饰字段,告知程序任何变量的访问均需要从共享内存中获取,而对他的改变必须同步刷新回共享内存,保证所有线程对变量的可见性.

    Synchronized

      可以修饰方法或者以同步块的形式使用保证多个线程在同一时刻,只能有一个线程处于方法的同步块中,保证了线程对变量访问的可见性和排他性.

      !任何线程对OBJECT的访问,首先要获取OBJECT的监视器,如果获取失败进入同步队列,状态为BLOCKED,当前驱释放了锁,释放操作唤醒阻塞在同步队列中的线程并且重新尝试访问

    等待/通知机制

      while方法能够检查变量是否符合预期,但是存在着以下问题

      1.难以确保及时性.

      2.难以降低开销

      所以JAVA有内置的等待通知机制来确保矛盾的解决(JAVA.LANG.OBJECT)

      

    等待/通知的相关方法
    notify() 通知一个在等待得线程,从WAIT()返回
    notifyAll() 通知全部在等待的线程
    wait() 调用方法进入WAITING状态,只有等待线程通知或中断才会返回
    WAIT(LONG) 超过等待一段时间,时间为MS
    WAIIT(LONG,INT)  超时时间的控制,最低为纳秒
       

     使用NOTIFY()或NOTIFYALL()需注意

      1.先对调用对象加锁

      2.调用WAIT()方法后,线程状态由RUNNING转变为WAITING,并将当前队列放到等待队列

      3.NOTIFY()或NOTIFYALL()方法调用后,等待线程依旧不会从WAIT()返回,需要调用NOTIFY()或者NOTIFYALL()线程释放之后,才有机会返回.

      4.notify()方法将等待队列移动到同步队列中,notifyAll()则将全部线程移动到同步队列中,移动状态从WAITING转变到BLOCKED

      5.wait()方法返回前题是获得调用对象的锁.

    等待/通知经典范式

      等待

      1.获取对象的锁

      2.条件不满足时调用WAIT()

      3.条件满足执行

       通知

      1.获得对象锁

      2.改变条件

      3.通知所有等待的对象线程

    管道I/O流

      主要用于数据传输,媒介为内存

      主要包括: PipedOutputStream,PipedInputStream,PipedReader,PipedWriter

     步骤:

        connect(PIPEDREADER);

    Thread.join()

      指当前线程等待Thread线程终止之后才从thread.join()返回,

    ThreadLocal

      线程变量,以ThreadLocaL对象为键,任意对象为值得存储结构,被附带在线程中,一个线程可以根据一个ThreadLocal变量对象查询到绑定这个线程上的值

      通过SET(T)来设置一个值,get()来获取

  • 相关阅读:
    .net core之上传文件的限制
    如何Telnet端口
    ES坑之logstash配置文件
    MySQL报错packets larger than max_allowed_packet are not allowed
    ES坑之安装
    ES坑之概述
    Git
    IDEA 搭建 maven(下)
    IDEA搭建maven(上)
    JDBC
  • 原文地址:https://www.cnblogs.com/EraserHead/p/6437452.html
Copyright © 2020-2023  润新知