2014-02-20 80 views
0

我有一個類,它從Swing中裝飾JTextComponent。它包含的方法可以從任何線程調用,所以我必須確保,與JTextComponent一起使用的代碼將由AWT線程執行。確定AWT線程

第二個要求是,調用整個方法的線程將「等待」,直到AWT線程完成任務。

public String getSelectedText() { 
     Callable c = new Callable() { 
      @Override 
      public Object call() throws Exception { 
       if (area.getSelectedText() == null) { 
        return ""; 
       } 
       return area.getSelectedText(); 
      } 
     }; 

     if (Thread.currentThread().getName().contains("AWT")) { 
      return (String)c.call(); 
     } 
     else { 
      FutureTask task = new FutureTask(c); 

      SwingUtilities.invokeLater(task); 

      while (!task.isDone()) { 
       //waiting 
      } 
      try { 
       return (String)task.get(); 
      } 
      catch (InterruptedException | ExecutionException ex) { 
       return ""; 
      } 
     } 
    } 

該代碼對我來說很好,但仍然存在一個問題。如果有人想要使用我的課,重命名AWT線程,那麼它陷入僵局。

是否有任何方法明確地標識AWT線程並避免此問題?

謝謝

回答

3

而是測試了名的,你應該檢查該線程是否是event dispatch thread

if (EventQueue.isDispatchThread()) { 
    // do stuff... 
} 

請注意,即使您正在使用AWT,您也可以撥打

if (SwingUtilities.isEventDispatchThread()) { 
    // do stuff... 
} 

,準確地得到一樣的東西。

+0

謝謝!而已 – user3334332

相關問題