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