• Java并发机制(1)--线程状态与方法(转)


     

    Java并发编程:Thread类的使用

    个人总结:参考:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920357.html

         参考:https://blog.csdn.net/sinat_36042530/article/details/52565296

     1、线程的状态:

      创建(new)  ->  就绪(runnable)          ->运行(running)->阻塞(blocked)
      (分配资源)   (等待获取cpu时间片)                                  ->消亡(dead)
    2、线程状态的转换:
      2.1:线程的阻塞状态
         1)调用sleep()进入睡眠状态
         2)调用wait()将线程挂起
         3)任务在等待某个输入输出的完成
         4)任务试图在某个对象上调用其同步控制方法。但是对象锁不可用。因为另外一个任务已经获得这个锁 (如等待获取锁)
         3)、4)两种情形interrupt方法将不会被中断
      2.2当线程Thread处在running状态时:
        (1):调用某个对象的wait()方法:这是继承自Object中的方法,当前线程释放锁,重新进入线程池等待,只有调用notify(),notifyAll()唤醒该线程,该线程才会就绪队列排队等待分配资源(进入锁池竞争锁)。
        (2):sleep方法是线程的,即交出当前的cpu时间片,但不会释放锁,时间到达后,也不一定会立即执行(如未获取时间片),且必须捕获InterruptedException异常或向上抛出。
        (3):yield方法,相当于sleep方法,交时间片不交锁,区别在于无法控制交出的时间。
        (4):join方法,thread.join():当前线程等待thread线程完成;thread.join(long m,(int nanoseconds)):当前线程等待thread线程执行m时间;
        (5):interrupt方法:只能中断1,2中的阻塞状态,使线程抛出异常,结束。而且不行中断只在running的线程(可以通过设定标志位flag结束)。
        (6):getId(),getName();
        (7):setDaemon和isDaemon设置守护线程,守护线程依赖于创建它的线程,而用户线程则不依赖。如垃圾收集器就是守护线程。

        wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

     如图:五种状态之间的转换;

     

    更详细请移步:博客园-海子-http://www.cnblogs.com/dolphin0520/p/3920357.html

    3、对象的锁池与等待池:
      (注:锁池与等待池是部分中文翻译造成的,实际还是对象内的唯一的内部锁Monitor)
      1、每一个java对象都有一个唯一与之对应的内部锁(Monitor)。
      2、线程Thread调用的wait()和notify()方法实际是继承自基层类Object的。
      3、JVM为每一个对象维护两个“队列”:Entry Set(入口集)和Wait Set(等待集)
       Entry Set(入口集):维护等待获取对象内部锁的所有线程;Wait Set维护执行了object.wait()、object.wait(long)的方法。
       Wait Set(等待集):维护所有执行了wait()或者wait(long time)的线程。
      4、状态转换的具体:
        一个对象objectX的内部锁为MonitorX,现在有线程A,B,C同时申请monitorX,假设B申请成功,那么A,C进入Blocked状态,进入obiectX的Entry Set当中;当线程B释放掉monitorX后,Entry Set中的任意一个线程(可能不是等待时间最长的)被唤醒进入Runnable状态,与其他活跃Runnable线程竞争锁,如果成功,则移出Entry Set,否则继续留在Entry Set中。
        如果一个线执行了objectX.wait(),那么该线程会被暂停(waiting),进入Wait Set中。当其他线程执行了notify或者notifyAll方法,Wait Set中的一个或多个线程被唤醒(Runnable),进入Entry Set,与处于Entry Set中的线程以及其他Runnable的线程争夺对象锁。若一个线程申请锁成功,该线程从wait Set中移出,否则仍然停留在waitSet中,Blocked,等待下次申请锁的机会。
      注意;notify()和notifyAll()方法只是唤醒等待该对象的monitor的线程,并不决定哪个线程能够获取到monitor。
  • 相关阅读:
    MySQL 锁的监控及处理
    mssql sqlserver 不固定行转列数据(动态列)
    SQL常用增删改查语句--来源于网络
    mssql sqlserver 对不同群组对象进行聚合计算的方法分享
    mssql sqlserver 自动备份存储过程的方法分享
    mssql sqlserver updatetext关键字应用简介说明
    mssql sqlserver 将字段null(空值)值替换为指定值的三种方法分享
    mssql sqlserver with cte表达式(递归)找出最顶值的方法分享
    mssql sqlserver text数据类型专题说明
    mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享
  • 原文地址:https://www.cnblogs.com/whtblog/p/8875484.html
Copyright © 2020-2023  润新知