zoukankan      html  css  js  c++  java
  • 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线程
    }

  • 相关阅读:
    函数式编程
    _.pick lodash
    Vue mixins extend
    js 导入json配置文件
    FormData
    shell中的调试与计算
    linux命令(6/10):find 命令
    Linux性能测试分析命令_sar+iostat+vmstat+top
    linux命令详解之(at)
    linux命令(6/9):watch命令
  • 原文地址:https://www.cnblogs.com/guosai1500581464/p/13393796.html
Copyright © 2011-2022 走看看