java监控函数执行时间

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

2006-12-29 16:45 4372人阅读 评论(1) 收藏 举报
 分类:
点滴(12) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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));
        
    }

}

java监控函数执行时间的更多相关文章

  1. Java 回调函数

    下面使用java回调函数来实现一个测试函数运行时间的工具类: 如果我们要测试一个类的方法的执行时间,通常我们会这样做: public class TestObject { /** * 一个用来被测试的 ...

  2. Java回调函数的理解与实现

    回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 在Java里面,我们使用接口来实现回调.举个例子 所谓的回调,就是程序员 ...

  3. hive 调用java的函数和科学记数法转换

    hive中field如果是string,比如id,那么使用10000000000+id结果是科学计数法显示,转换为正常显示方法: select (10000000000+cast(id as int) ...

  4. [Java]_函数传参的疑惑与思考

    问题来源于leetcode上的两道题 Path Sum I && II,分别写了两个dfs. void dfs(TreeNode node , int sum , ArrayList& ...

  5. Java的函数与函数重载

    关于Java的函数与函数重载 关于Java的函数与函数重载 1. 函数 假设有一个游戏程序,程序在运行过程中,要不断地发射炮弹.发射炮弹的动作都需要使用一段百行左右的程序代码,在每次发射炮弹的地方都要 ...

  6. cocos2d-x 通过JNI实现c/c++和Android的java层函数互调

    文章摘要: 本文主要实现两个功能: (1)通过Android sdk的API得到应用程序的包名(PackageName),然后传递给c++层函数. (2)通过c++函数调用Android的java层函 ...

  7. java 一个函数EnumMap返回多个值

    java 一个函数如何返回多个值   在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值 ...

  8. JAVA – 虚函数、抽象函数、抽象类、接口

     本文转载地址:http://blog.csdn.net/trojanpizza/article/details/6556604 1. Java虚函数 虚函数的存在是为了多态. C++中普通成员函数加 ...

  9. MinerMonitorThread.java 监控线程

    MinerMonitorThread.java 监控线程 package com.iteye.injavawetrust.miner; import org.apache.commons.loggin ...

随机推荐

  1. classname 就是在css上添加类,然后js的类名等于

      <!DOCTYPE HTML>   <html>   <head>   <meta http-equiv="Content-Type" ...

  2. JDK1.5与1.6在Override上的区别

    @Override是JDK5 就已经有了,但有个小小的Bug,就是不支持对接口的实现,认为这不是Override 而JDK6 修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现都可以加上@Ove ...

  3. 微信接口开发1--向微信发送请求--获取access_token

    //随便放置一个php文件在服务器上.执行该方法--调用模拟get提交---到微信-->获得微信返回的access_token 不建议自己编写模拟get提交方法. 建议直接导入微信框架LaneW ...

  4. nginx 部署多网站

    1, www 下面加一个文件夹 abc 2,   在default.conf 复制一下 ,abc.conf , 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  5. PHP扩展开发-简单类扩展

    今天来学习简单类扩展开发 实现目标为如下php的类 <?php class classext(){ private $username; CONST URL="http://www.g ...

  6. 编译安装SVN不结合apache

    前言:独立SVN服务器不结合APACHE安装使用,连接独立SVN服务器也不是用HTTP协议.这是比较快捷的SVN服务器配置方法. 一.下载工具 1.subversion-1.6.17.tar.gz 2 ...

  7. 笨方法学python--第一个程序

    该章主要知识点有: 1 print 打印,有双引号,单引号 2 分析报错信息,积累经验 3 # -*- coding:utf-8 -*-,可以输出汉字 4 井号,# ,注释, 英文名 octothor ...

  8. # 泰语字符串字符分割 --- UTF-8编码格式

    1.泰语编码格式 泰语用的编码格式是:ISO 8859-11,这个是Latin编码系列,是从"ISO-8859-1"发展过来的,采用的是8bit一个字,所以泰语中的英文字母或者数字 ...

  9. C++ 字符串字面值

    C++ 字符串字面值 C++ 基本字符串类型 C++ 字符串类型 char 和 wchar_t c11 新增了 char16_t 和 char32_t 例子: wchat_t title[] = L& ...

  10. java获取数据库的列名、类型等信息

    当你使用和学习JDK的时候,可以查看并学习它所提供给你的两个ResultSetMetaData 和DataBaseMetaData类的源码并很好的了解它们的实现原理和思路,JDBC中提供有两种源数据, ...