熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

在非用戶線程中訪問用戶線程的GUI資源

2013-11-23 19:59:20  來源: Java高級技術 
    ——此文章摘自《自己動手寫開發工具基於Eclipse的工具開發》定價 特價 詳細>>

    在非用戶線程中對用戶線程的GUI資源進行訪問的時候如果不進行同步的話就會造成不可預料的問題AWT/Swing中並沒有強制在非用戶線程中訪問用戶線程的GUI資源的時候要進行同步而SWT則進行了同步控制這樣就可以預防這些不可預料的問題在SWT中通常存在一個被稱為用戶線程的唯一線程只有在這個線程中才能調用對組件或某些圖形 API的訪問操作如果在非用戶線程中程序直接調用這些訪問操作那麼SWTExcepiton異常會被拋出

    下面看一個例子
    Runnable r = new Runnable() {
        public void run()
        {
            for (int i = ; i < ; i++)
            {
                try
                {
                    wait();
                } catch (InterruptedException e)
                {
                }
                textsetText(new Integer(i)toString());
            }
        }
    };

    我們啟動一個線程在這個線程中每隔一秒為界面文本控件賦值一次運行後就會拋出SWT異常

    解決這個問題的方法也是非常簡單的那就是通過Display類的syncExec(Runnable)和asyncExec(Runnable)這兩個方法去實現
    Runnable r = new Runnable() {
        public void run()
        {
            for (int i = ; i < ; i++)
            {
                try
                {
                    wait();
               } catch (InterruptedException e) { }
                final int j = i;
                displayasyncExec(new Runnable() {
                    public void run()
                    {
                        textsetText(new Integer(j)toString());
                    }
                });
            }
        }
    };

    方法syncExec()和asyncExec()的區別在於前者要在指定的線程執行結束後才返回而後者無論指定的線程是否執行都會立即返回到當前線程


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27779.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.