java基础学习总结——java.awt.EventQueue.invokeLater干什么用的

Java中Swing是线程不安全的,是单线程的设计,这样的造成结果就是:只能从事件派发线程访问将要在屏幕上绘制的Swing组件。事件派发线程是调用paint和update等回调方法的线程,它还是事件监听器接口中定义的事件处理方法,例如,ActionListener中的actionPerformed方法在事件派发线程中调用。 
Swing是事件驱动的,所以在回调函数中更新可见的GUI是很自然的事情,比如,有一个按钮被按下,项目列表需要更新时,则通常在与该按钮相关联的事件监听器的actionPerformed方法中来实现该列表的更新,从事件派发线程以外的线程中更新Swing组件是不正常的。 
有时需要从事件派发线程以外的线程中更新Swing组件,例如,在actionPerformed中有很费时的操作,需要很长时间才能返回,按钮激活后需要很长时间才能看到更新的列表,按钮会长时间保持按下的状态只到actionPerformed返回,一般说来耗时的操作不应该在事件处理方法中执行,因为事件处理返回之前,其他事件是不能触发的,界面类似于卡住的状况,所以在独立的线程上执行比较耗时的操作可能更好,这会立即更新用户界面和释放事件派发线程去派发其他的事件。 
SwingUtilities类提供了两个方法:invokeLate和invoteAndWait,它们都使事件派发线程上的可运行对象排队。当可运行对象排在事件派发队列的队首时,就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块。 
只有从事件派发线程才能更新组件。 
程序示例:更新组件的错误方法

<code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> startButton.addActionListener(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> ActionListener() {
   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> actionPerformed(ActionEvent e) {
    GetInfoThread t = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> GetInfoThread(Test.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>);
    t.start();
    startButton.setEnabled(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">false</span>);
   }
  });

  <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">GetInfoThread</span> <span class="hljs-inheritance" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span></span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Thread</span> {</span>
 Test applet;

 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> GetInfoThread(Test applet) {
  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.applet = applet;
 }

  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> run() {
   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>) {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {
     Thread.sleep(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span>);
     applet.getProgressBar().setValue(Math.random() * <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span>);
    } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (InterruptedException e) {
     e.printStackTrace();
    }
   }
  }
 }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li></ul>

错误分析:在actionPerformed中,监听器把按钮的允许状态设置为false,由于是在事件派发线程上调用actionPerformed,所以setEnabled是一个有效的操作,但是在GetInfoThread中设置进度条是一个危险的做法,因为事件派发线程以外的线程更新了进度条,所以运行是不正常的。

1、invokeLater使用

<code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">GetInfoThread</span> <span class="hljs-inheritance" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">extends</span></span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">Thread</span> {</span>
  Test applet;

  Runnable runx;

  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> value;

  <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> GetInfoThread(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">final</span> Test applet) {
   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.applet = applet;
   runx = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> Runnable() {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> run() {
     JProgressBar jpb = applet.getProgressBar();
     jpb.setValue(value);
    }
   };
  }

   <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> run() {
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">true</span>) {
     <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">try</span> {
      Thread.sleep(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">500</span>);
      value = (<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>) (Math.random() * <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">100</span>);
      System.out.println(value);
      SwingUtilities.invokeLater(runx);
     } <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">catch</span> (InterruptedException e) {
      e.printStackTrace();
     }
    }
   }
  }</code><code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">
</code><code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">
</code><code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">
</code><code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">
</code><code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">
</code><code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">
</code><code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">
</code><code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">
</code><code class="hljs axapta has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span style="color: rgb(51, 51, 51); font-family: 宋体; font-size: 14px; line-height: 28px; background-color: rgb(249, 249, 249);">public class EventQueueextends ObjectEventQueue 是一个与平台无关的类,它将来自于底层同位体类和受信任的应用程序类的事件列入队列。 </span></code><div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none; color: rgb(51, 51, 51); font-family: 宋体; font-size: 14px; line-height: 28px; background-color: rgb(249, 249, 249);"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">它封装了异步事件指派机制,该机制从队列中提取事件,然后通过对此 EventQueue 调用 dispatchEvent(AWTEvent) 方法来指派这些事件(事件作为参数被指派)。该机制的特殊行为是与实现有关的。<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">指派实际排入到该队列中的事件(注意,正在发送到 EventQueue 中的事件可以被合并)的唯一要求是: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">按顺序指派。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">也就是说,不允许同时从该队列中指派多个事件。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">指派顺序与它们排队的顺序相同。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">也就是说,如果 AWTEvent A 比 AWTEvent B 先排入到 EventQueue 中,那么事件 B 不能在事件 A 之前被指派。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">一些<a target=_blank href="http://www.2cto.com/os/liulanqi/" target="_blank" class="keylink" style="color: rgb(51, 51, 51); text-decoration: none;">浏览器</a>将不同代码基中的 applet 分成独立的上下文,并在这些上下文之间建立一道道墙。在这样的场景中,每个上下文将会有一个 EventQueue。其他浏览器将所有的 applet 放入到同一个上下文中,这意味着所有 applet 只有一个全局 EventQueue。该行为是与实现有关的。有关更多信息,请参照浏览器的文档。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">postEvent<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">public void postEvent(AWTEvent theEvent)将一个 1.1 样式的事件发送到 EventQueue 中。如果在队列中存在具有相同 ID 和事件源的事件,则调用源 Component 的 coalesceEvents 方法。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">参数:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">theEvent - java.awt.AWTEvent 的实例,或者是它的子类 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">抛出: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">NullPointerException - 如果 theEvent 为 null<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">--------------------------------------------------------------------------------<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">getNextEvent<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">public AWTEvent getNextEvent()<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">                      throws InterruptedException从 EventQueue 中移除一个事件,并返回该事件。在另一个线程发送事件之前该方法被阻塞。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">返回:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">下一个 AWTEvent <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">抛出: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">InterruptedException - 如果任何线程中断了此线程<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">--------------------------------------------------------------------------------<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">peekEvent<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">public AWTEvent peekEvent()返回 EventQueue 上的第一个事件,而不移除它。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">返回:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">第一个事件<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">--------------------------------------------------------------------------------<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">peekEvent<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">public AWTEvent peekEvent(int id)返回指定 id(如果有) 的第一个事件。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">参数:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">id - 所需事件类型的 id <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">返回:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">指定 id 的第一个事件,如果没有这样的事件,则返回 null<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">--------------------------------------------------------------------------------<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">dispatchEvent<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">protected void dispatchEvent(AWTEvent event)指派一个事件。指派事件的方式取决于事件的类型和事件的源对象的类型: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">事件类型 源类型 指派 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">ActiveEvent 所有 event.dispatch() <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">其他 Component source.dispatchEvent(AWTEvent) <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">其他 MenuComponent source.dispatchEvent(AWTEvent) <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">其他 其他 无动作(忽略) <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">参数:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">event - java.awt.AWTEvent 的实例或者是它的子类 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">抛出: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">NullPointerException - 如果 event 为 null<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">从以下版本开始: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">1.2 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">--------------------------------------------------------------------------------<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">getMostRecentEventTime<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">public static long getMostRecentEventTime()返回最近事件的时间戳(如果有),该事件从 EventQueue(它与正在调用的线程相关)进行指派。如果具有时间戳的事件目前正被指派,则返回它的时间戳。如果没有事件被指派,则返回 EventQueue 的初始化时间。在 JDK 的当前版本中,只有 InputEvent、ActionEvent 和 InvocationEvent 有时间戳;但是,JDK 的未来版本可能将时间戳添加到其他事件类型中。注意,该方法只应该从应用程序事件的指派线程进行调用。如果从另一个线程调用该方法,则返回当前<a target=_blank href="http://www.2cto.com/os/" target="_blank" class="keylink" style="color: rgb(51, 51, 51); text-decoration: none;">系统</a>的时间(由 System.currentTimeMillis() 报告)。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">返回:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">最后一次 InputEvent 的时间戳,要指派的 ActionEvent 或 InvocationEvent,如果在不同于事件指派线程的线程上调用该方法,则返回 System.currentTimeMillis()<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">从以下版本开始: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">1.4 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">另请参见:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">InputEvent.getWhen(), ActionEvent.getWhen(), InvocationEvent.getWhen()<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">--------------------------------------------------------------------------------<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">getCurrentEvent<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">public static AWTEvent getCurrentEvent()返回当前正在被 EventQueue(它与正在调用的线程相关)指派的事件。只有某个方法需要访问事件时,但是并没有被设计为可以将事件作为参数来接受,则此方法很有用。注意,该方法应该只从应用程序的事件指派线程进行调用。如果从另一个线程调用该方法,则返回 null。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">返回:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">当前正被指派的事件;如果调用该方法的线程不是事件指派线程,则返回 null<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">从以下版本开始: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">1.4 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">--------------------------------------------------------------------------------<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">push<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">public void push(EventQueue newEventQueue)用指定的事件队列替换现有的 EventQueue。任何挂起的事件都被传输到 EventQueue 以备处理。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">参数:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">newEventQueue - 要使用的 EventQueue(或其子类的)的实例 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">抛出: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">NullPointerException - 如果 newEventQueue 为 null<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">从以下版本开始: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">1.2 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">另请参见:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">pop()<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">--------------------------------------------------------------------------------<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">pop<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">protected void pop()<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">            throws EmptyStackException停止使用此 EventQueue 指派事件。任何挂起的事件都被传输到以前的 EventQueue 以备处理。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">警告:为了避免死锁,不要在子类中将该方法声明为 synchronized。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">抛出: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">EmptyStackException - 如果以前没有对该 EventQueue 执行 push 操作<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">从以下版本开始: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">1.2 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">另请参见:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">push(java.awt.EventQueue)<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">--------------------------------------------------------------------------------<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">isDispatchThread<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">public static boolean isDispatchThread()如果正在调用的线程是当前 AWT EventQueue 的指派线程,则返回 true。使用此调用确保给定的任务正在当前 AWT EventDispatchThread 上执行(或没有执行)。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">返回:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">如果给定的任务正在当前 AWT EventQueue 的指派线程上运行,则返回 true。<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">从以下版本开始: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">1.2 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">--------------------------------------------------------------------------------<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">invokeLater<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">public static void invokeLater(Runnable runnable)导致 runnable 的 run 方法在 the system EventQueue 的指派线程中被调用。 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">参数:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">runnable - Runnable 对象,其 run 方法应该在 EventQueue 上同步执行<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">从以下版本开始: <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">1.2 <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">另请参见:<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">invokeAndWait(java.lang.Runnable)<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">--------------------------------------------------------------------------------<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;"> <div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">invokeAndWait<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">public static void invokeAndWait(Runnable runnable)<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">                          throws InterruptedException,<div style="border-width: 0px; padding: 0px; margin: 0px; list-style: none;">                                 InvocationTargetException导致 runnable 的 run 方法在 the system EventQueue 的指派线程中被调用。在所有挂起事件被处理后才发生。在这发生之前调用被阻塞。如果从事件指派线程进行调用,则该方法将抛出 Error。 </div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值