也談一談Java線程的超時控制方法 – JAVA編程語言程序開發技術文章

下面這段代碼在搜索java線程的超時控制時很容易被找到,並且結果的數量也不少。但是這段代碼能夠得到想要的結果麼?
  開始的時候我一看這麼多,也沒多想,直接下載用瞭,但是程序裡的bug依舊,以為程序裡還有其它的問題,折騰瞭小半天,發現原來超時控制沒有起作用,仔細核實瞭一下以下的代碼,發現這段代碼根本得到不到想要的結果。



 /**
  * 本線程設置瞭一個超時時間
  * 該線程開始運行後,經過指定超時時間,
  * 該線程會拋出一個未檢查異常通知調用該線程的程序超時
  * 在超時結束前可以調用該類的cancel方法取消計時
  * @author solonote
  */
  public class TimeoutThread extends Thread{
  /**
  * 計時器超時時間
  */
  private long timeout;
  /**
  * 計時是否被取消
  */
  private boolean isCanceled = false;
  /**
  * 當計時器超時時拋出的異常
  */
  private TimeoutException timeoutException;
  /**
  * 構造器
  * @param timeout 指定超時的時間
  */
  public TimeoutThread(long timeout,TimeoutException timeoutErr) {
  super();
  this.timeout = timeout;
  this.timeoutException = timeoutErr;
  //設置本線程為守護線程
  this.setDaemon(true);
  }
  /**
  * 取消計時
  */
  public synchronized void cancel()
  {
  isCanceled = true;
  }
  /**
  * 啟動超時計時器
  */
  public void run()
  {
  try {
  Thread.sleep(timeout);
  if(!isCanceled)
  throw timeoutException;
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
  }
  }



  想起來socks有超時控制的代碼,根蹤瞭一下,發現它的超時控制直接延伸到native方法,看來不是在java層面的實現的,想來java的裡想在一個線程裡控制另外一個程序是不大容易瞭,那麼隻能設計一種替代的模式來工作瞭,還有別的路可以走麼?


 
 public class TestThreadTimeout extends Thread {
  public static void main(String[] args) {
  TestThreadTimeout ttt = new TestThreadTimeout();
  ttt.start();
  }
  public void run() {
  int timeout = 2000;
  TestThread task = new TestThread();
  task.start();
  try {
  task.join(timeout);
  } catch (InterruptedException e) {
  /* if somebody interrupts us he knowswhat he is doing */
  }
  if (task.isAlive()) {
  task.interrupt();
  System.out.println(“超時啦。。。”);
  throw new TimeoutException(“xxx”);
  } else {
  System.out.println(“沒超時…”);
  }
  }
  }
  class TestThread extends Thread {
  public void run() {
  try {
  Thread.sleep(5000);
  System.out.println(“ccccccccccccc”);
  } catch (Exception ex) {
  ex.printStackTrace();
  }
  }
  //如果希望run中方法正常結束,覆蓋interrupt方法
  public void interrupt() {
  System.out.println(“qqqqqqqqqqqqqqqq”);
  }
  }


 

發佈留言