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