• Java中线程状态的各种转换关系


     状态1:新建一个线程并且开启start()方法,使Java线程和操作系统线程联系起来;

    状态2:Running——Waiting  :调用wait方法

    synchronized(lock){
        lock.wait();      //进入waiting状态,释放锁
    }
    
    synchronized(lock){
        lock.notifyAll();      //,唤醒所有线程,使所有在waiting状态的线程进入blocked状态,进入entry List队列和其他线程一起竞争锁
    }

    状态3Running——Waiting:调用join()方法   join()方法最终调用的也是wait方法,它使用了保护性暂停机制:当两个线程之间有关系时,比如一个线程需要等待另外一个线程的结果,t.join()所有其他的线程都必须等待t线程执行完了才能执行

    public final void join() throws InterruptedException {
            join(0);
        }
    
    
    public final synchronized void join(long millis)
        throws InterruptedException {
            long base = System.currentTimeMillis();
            long now = 0;
    
            if (millis < 0) {
                throw new IllegalArgumentException("timeout value is negative");//判断是否超时
            }
    
            if (millis == 0) {
                while (isAlive()) {     //判断线程是否活着,如果
                    wait(0);
                }
            } else {
                while (isAlive()) {
                    long delay = millis - now;
                    if (delay <= 0) {
                        break;
                    }
                    wait(delay);
                    now = System.currentTimeMillis() - base;
                }
            }
        }

     park(t)   unpark(t)  可以指定需要唤醒的线程,每一个线程都有一个parker对象 包含counter  mutex 当线程调用  大致是下面这个意思

    park(t){
    if(t.ounter == 0)
    t.wait;
    else if (t.counter == 1)
    counter = 0;
    }
    
    unpark(t){
    if(t.counter == 1)
    
    }
    e;se if(t.counter == 0){
    t.counter = 0;
    唤醒t线程
    }

  • 相关阅读:
    hdfs shell命令
    雪碧图
    绝对定位
    相对定位
    Vue 自定义指令
    Vue 【组件】组件注册、组件生命周期、动态组件、keep-alive
    Git 使用
    React 【生命周期】三个阶段生命周期函数、不同生命周期详解、图解生命周期
    【华为云技术分享】一统江湖大前端DOClever—你的Postman有点Low
    【华为云技术分享】圣诞特别版 | 数据库频频出现OOM问题该如何化解?
  • 原文地址:https://www.cnblogs.com/guosai1500581464/p/13393796.html
Copyright © 2020-2023  润新知