2014-02-20 25 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

相关问题