zoukankan      html  css  js  c++  java
  • 控制方法执行时间

    可以通过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

  • 相关阅读:
    在浏览器中输入URL后,执行的全部过程。会用到哪些协议?(一次完整的HTTP请求过程)
    线程的5种状态详解
    哈希表(Hash Table)原理及其实现 【转载】
    notify() 和 notifyAll() 有什么区别? wait()
    B树、B-树、B+树、B*树介绍,和B+树更适合做文件索引的原因 【转】
    pthread_join和pthread_detach的用法 【】转载】
    什么是进程?什么是线程
    进程间的五种通信方式介绍【转载】
    81. Search in Rotated Sorted Array II
    33. Search in Rotated Sorted Array
  • 原文地址:https://www.cnblogs.com/zxporz/p/10888737.html
Copyright © 2011-2022 走看看