Change Dir

先知cd——热爱生活是一切艺术的开始

统计

留言簿(18)

积分与排名

“牛”们的博客

各个公司技术

我的链接

淘宝技术

阅读排行榜

评论排行榜

分享一个ThreadMonitor

来自commons-io的一段小程序,感觉会有用,拿来分享一下:

   1: /*
   2:  * Licensed to the Apache Software Foundation (ASF) under one or more
   3:  * contributor license agreements.  See the NOTICE file distributed with
   4:  * this work for additional information regarding copyright ownership.
   5:  * The ASF licenses this file to You under the Apache License, Version 2.0
   6:  * (the "License"); you may not use this file except in compliance with
   7:  * the License.  You may obtain a copy of the License at
   8:  *
   9:  *      http://www.apache.org/licenses/LICENSE-2.0
  10:  *
  11:  * Unless required by applicable law or agreed to in writing, software
  12:  * distributed under the License is distributed on an "AS IS" BASIS,
  13:  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14:  * See the License for the specific language governing permissions and
  15:  * limitations under the License.
  16:  */
  17: package org.apache.commons.io;
  18:  
  19: /**
  20:  * Monitors a thread, interrupting it of it reaches the specified timout.
  21:  * <p>
  22:  * This works by sleeping until the specified timout amount and then
  23:  * interrupting the thread being monitored. If the thread being monitored
  24:  * completes its work before being interrupted, it should <code>interrupt()<code>
  25:  * the <i>monitor</i> thread.
  26:  * <p>
  27:  * 
  28:  * <pre>
  29:  *       long timeoutInMillis = 1000;
  30:  *       try {
  31:  *           Thread monitor = ThreadMonitor.start(timeoutInMillis);
  32:  *           // do some work here
  33:  *           ThreadMonitor.stop(monitor);
  34:  *       } catch (InterruptedException e) {
  35:  *           // timed amount was reached
  36:  *       }
  37:  * </pre>
  38:  *
  39:  * @version  $Id: ThreadMonitor.java 1002689 2010-09-29 15:43:48Z niallp $
  40:  */
  41: class ThreadMonitor implements Runnable {
  42:  
  43:     private final Thread thread;
  44:     private final long timeout;
  45:  
  46:     /**
  47:      * Start monitoring the current thread.
  48:      *
  49:      * @param timeout The timout amount in milliseconds
  50:      * or no timeout if the value is zero or less
  51:      * @return The monitor thread or <code>null</code>
  52:      * if the timout amount is not greater than zero
  53:      */
  54:     public static Thread start(long timeout) {
  55:         return start(Thread.currentThread(), timeout);
  56:     }
  57:  
  58:     /**
  59:      * Start monitoring the specified thread.
  60:      *
  61:      * @param thread The thread The thread to monitor
  62:      * @param timeout The timout amount in milliseconds
  63:      * or no timeout if the value is zero or less
  64:      * @return The monitor thread or <code>null</code>
  65:      * if the timout amount is not greater than zero
  66:      */
  67:     public static Thread start(Thread thread, long timeout) {
  68:         Thread monitor = null;
  69:         if (timeout > 0) {
  70:             ThreadMonitor timout = new ThreadMonitor(thread, timeout);
  71:             monitor = new Thread(timout, ThreadMonitor.class.getSimpleName());
  72:             monitor.setDaemon(true);
  73:             monitor.start();
  74:         }
  75:         return monitor;
  76:     }
  77:  
  78:     /**
  79:      * Stop monitoring the specified thread.
  80:      *
  81:      * @param thread The monitor thread, may be <code>null</code>
  82:      */
  83:     public static void stop(Thread thread) {
  84:         if (thread != null) {
  85:             thread.interrupt();
  86:         }
  87:     }
  88:  
  89:     /**
  90:      * Construct and new monitor.
  91:      *
  92:      * @param thread The thread to monitor
  93:      * @param timeout The timout amount in milliseconds
  94:      */
  95:     private ThreadMonitor(Thread thread, long timeout) {
  96:         this.thread = thread;
  97:         this.timeout = timeout;
  98:     }
  99:  
 100:     /**
 101:      * Sleep until the specified timout amount and then
 102:      * interrupt the thread being monitored.
 103:      *
 104:      * @see Runnable#run()
 105:      */
 106:     public void run() {
 107:         try {
 108:             Thread.sleep(timeout);
 109:             thread.interrupt();
 110:         } catch (InterruptedException e) {
 111:             // timeout not reached
 112:         }
 113:     }
 114: }

 

以上这段代码,示例程序演示了使用,但是直接copy可能会看到红叉,很简单,your work应该是有InterruptedException异常抛出才好。

检查程序执行时间的代码肯定所有人都写过一大坨了,但是换个角度如何,我们给设定一个时间阈值timeout,然后运行这个monitor进程,判断自己写的程序是否超时。这个需求,我想很多人都是有的吧。

简单的示例

   1: long timeoutInMillis = 1000;
   2:         try {
   3:             Thread monitor = ThreadMonitor.start(timeoutInMillis);
   4:             //do your work
   5:             // 1, Thread.sleep(0);
   6:             // 2, calc();
   7:             ThreadMonitor.stop(monitor);
   8:         } catch (InterruptedException e) {
   9:             //catch the timeout work
  10:         }

像注释1一样使用,是我的一个小trick,像注释2那样使用可能更好一些,因为直接调用方法,产生的5.9倍单元计算的开销还是可以接受的。

当然你自己的calc方法需要throws InterruptedException。

posted on 2012-02-20 19:36 changedi 阅读(2615) 评论(2)  编辑  收藏 所属分类: 好代码分享

评论

# re: 分享一个ThreadMonitor 2012-02-23 22:00 midstr

为啥不用juc呢?  回复  更多评论   

# re: 分享一个ThreadMonitor 2012-02-27 18:49 changedi

@midstr
一个最直接的原因~~简单而且兼容低版本jdk  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: