• 控制方法执行时间


    可以通过join的特性控制方法的执行时间

    join :当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行。

    Thread thread = new Thread(() -> {
        try {
            Thread.sleep(3000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName());
    },"子线程");
    thread.start();
    //thread插入当前线程(调用join的线程),当前线程挂起,thread运行完毕后当前线程继续
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("运行完毕");

    注意是调用thread.join();的线程挂起(不是thread挂起),等着thread调用完毕后当前线程才继续,看一下源码

    //在Thread类中定义,说明调用的是thread对象的join方法
    //假设main线程调用了thread线程的join方法
    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) {
            //main线程第一次进来,thread线程还在运行
            while (isAlive()) {
                //这里要注意,wait后释放了thread对象的锁
                //⭐⭐虽然调用的thread的wait方法(本质是Object的)但是终归是由main线程调用的wait方法,挂起的是main线程,并不是thread
                //当thread运行完毕后,并不存在notify,jvm底层自然会调度唤醒main线程
                wait(0);
            }
        } else {
            //控制时间的先不看
            …………
        }
    }

    通过join的特性控制方法的执行时间

        /**
         * 控制方法运行时间
         * @param thread
         * @param cTime
         * @throws Exception
         */
        public void monitor(Thread thread,long cTime) throws Exception {
            long begin = System.currentTimeMillis();
            if(thread.getState() != Thread.State.NEW){
                throw new Exception("Thread State Error");
            }
            thread.start();
            thread.join(cTime);
            if(thread.getState() != Thread.State.TERMINATED){
                thread.stop();
            }
            System.out.println("运行时间监控:"+(System.currentTimeMillis()-begin));
        }

    测试以及代码获取详见:

    https://gitee.com/zxporz/zxp-thread-test/blob/master/src/main/java/org/zxp/thread/communication/join/ControlTime.java

  • 相关阅读:
    离线安装SilverLight
    Singleton模式
    首次进入
    实现多层菜单(=_=!)(很傻又很土的办法)
    【转】Java中Split函数的用法技巧
    【转】来电显示
    DatePickerDialog
    Unable to resolve target 'android9'
    退出activity的另一种写法
    滚轮控件的定义和使用
  • 原文地址:https://www.cnblogs.com/zxporz/p/10888737.html
Copyright © 2020-2023  润新知