zoukankan      html  css  js  c++  java
  • java监控函数执行时间

    java监控函数执行时间

    http://blog.csdn.net/ycg01/article/details/1467542

     

    java监控函数执行时间

    标签: javathreadclassstringnull
     分类:
     

    由于一些特殊需要,对执行流加上超时控制.以自己的水平想了下面的方法.也许有更好的通用方法,只是我不知道.呵,写出来,供有需要的人参考.

    TimeoutThread.java


    public class TimeoutThread{
        long milliseconds;
        private void notifyObj(){
            synchronized(this){
                notify();
            }
        }
        
        public TimeoutThread(long milliseconds){
            this.milliseconds = milliseconds;
        }
        
        public void mydo(){
            
        }
        
        Thread runthread = null;
        private void myrun(){
            
            class MyThread extends Thread{
                public void run(){
                    try{
                        //监控程序执行时间不得超过
                        Thread.sleep(milliseconds);
                    }catch(Exception exp){
                        //exp.printStackTrace();
                    }
                    //如果程序超出时间,停止原线程
                    runthread.interrupt();
                    
                    //防止InterruptedException被捕获而杀不了,尝试20次
                    int i=0;
                    while(runthread.isAlive()){
                        try{
                        Thread.sleep(50);
                        }catch(Exception exp){}
                        runthread.interrupt();
                        i++;
                        if(i>20){
                            break;
                        }
                        System.out.println(i);
                    }
                    
                    notifyObj();
                }
            }
            //将被监视线程指定为当前线程
            runthread = Thread.currentThread();
            //创建监控线程,设为非阻塞线程
            MyThread timeOutThread = new MyThread();
            timeOutThread.setDaemon(true);
            timeOutThread.start();
            mydo();
            timeOutThread.interrupt();
        }
        
        public void run(){
            try{
                new Thread(){
                    public void run(){
                        try{
                            myrun();
                            notifyObj();
                        }catch(Exception exp){
                            notifyObj();
                            exp.printStackTrace();
                        }
                    }
                }.start();
                synchronized(this){
                    wait();
                }
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }

    TT.java


    public class TT {

        public static String getName(long ms){
            final StringBuffer sb = new StringBuffer();
            new TimeoutThread(ms){
                public void mydo(){    
                    try{
                        Thread.sleep(2000);
                        sb.append("hello world");
                    }catch(Exception exp){
                        
                    }
                }
            }.run();
            return sb.toString();
        }
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            System.out.println("begin 5000 method");
            new TimeoutThread(5000){
                public void mydo(){    
                    //该函数不能将InterruptedException捕获而不抛出,否则,无法起到监控效果
                    //java.lang.InterruptedException
                    //此函数显示了不能正确被关闭
                    for(int i=0;i<20;i++){
                        try{
                            Thread.sleep(1000);
                        }catch(Exception exp){
                            //exp.printStackTrace();
                        }
                        System.out.println("step:"+i);
                    }
                    System.out.println("eeeee:");
                }
            }.run();
            
            System.out.println("end method");
            
            System.out.println("begin 5000 method");
            new TimeoutThread(5000){
                public void mydo(){    
                    //该函数不能将InterruptedException捕获,否则,无法起到监控效果
                    //java.lang.InterruptedException
                    try{
                        for(int i=0;i<10;i++){
                            Thread.sleep(1000);
                            System.out.println("step:"+i);
                        }
                    }catch(Exception exp){
                        //exp.printStackTrace();
                    }
                }
            }.run();
            
            System.out.println("end method");
            
            System.out.println("get name is:"+getName(1000));
            System.out.println("get name is:"+getName(5000));
            
        }

    }
  • 相关阅读:
    转载:渗透利器-余弦
    搜索引擎?
    Gartner:用自适应安全架构来应对高级定向攻击
    内网渗透测试思路-FREEBUF
    渗透测试常规思路分析-FREEBUF
    SQLMAP使用笔记
    如何打造一款优秀的产品管理系统?
    阿里的钉钉能干掉腾讯的微信么?
    下一个亿万市场:企业级SaaS服务谁能独领风骚
    如何注册iClap账号?
  • 原文地址:https://www.cnblogs.com/donaldlee2008/p/5312183.html
Copyright © 2011-2022 走看看