基於效率和用戶可擴展性的考慮,swing被設計成非線程安全的。swing程序中有兩個線程被前後建立main主線程和事件分派線程,main可能很快就退出了,swing事件響應代碼在事件分派線程中執行。java
若須要完成一個耗時的任務,則能夠啓動一個新線程來處理。可是不能在新線程中直接操做swing組件!這可能致使swing崩潰。一種狀況就是咱們須要在更新界面的進度條或標籤等。處理的辦法是使用java.awt.EventQueue,將更新界面的代碼放入static的invokeLater或invokeAndWait方法中。如更新一個標籤[1]安全
- EventQueue.invokeLater(new Runnable(){
- public void run(){
- lable.setText(percentage + "% complete");
- }
- });
這樣就將事件發佈到事件隊列中。沒有新的線程被建立!異步
invokeLater方法直接返回,run()被異步執行。ide
invokeAndWait則直到run()執行結束返回。spa
[1]Java2核心技術卷2高級特性7th線程