国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

關(guān)于Eclipse中UI程序的線程的討論

2019-11-18 15:41:13
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  雖然各個(gè)操作系統(tǒng)之間的線程機(jī)制是不一樣的,但是大致是相同的。當(dāng)用戶使用GUI程序時(shí),假如點(diǎn)鼠標(biāo)或按下鍵盤上的鍵等時(shí),操作系統(tǒng)會(huì)產(chǎn)生對(duì)應(yīng)的GUI事件,它來(lái)決定哪個(gè)窗口或程序來(lái)接受每一個(gè)事件并且放到程序的事件隊(duì)列中.

      任何GUI程序的底層結(jié)構(gòu)就是一個(gè)事件循環(huán).程序首先初始化事件循環(huán),并開(kāi)始循環(huán),這個(gè)循環(huán)會(huì)從事件隊(duì)列依次接收GUI事件并一一做出相應(yīng)的反應(yīng).程序應(yīng)該對(duì)事件做出快速的反應(yīng)使程序一直對(duì)用戶有響應(yīng),舉個(gè)例子,用戶點(diǎn)了一下程序里的一個(gè)按鈕結(jié)果程序就沒(méi)反應(yīng)了,那么這個(gè)程序應(yīng)該算是一個(gè)失敗的程序吧.

      假如某個(gè)UI事件引發(fā)了某個(gè)需要長(zhǎng)時(shí)間的事務(wù),那么應(yīng)該把它放到一個(gè)另外的單獨(dú)的線程中,這樣程序的那個(gè)事件循環(huán)就能夠馬上回來(lái)響應(yīng)用戶的下一個(gè)操作.線程是非常復(fù)雜的一個(gè)主題,假如處理的不好很輕易造成死鎖等很糟糕的情況.

      還好,eclipse為我們開(kāi)發(fā)插件提供了一個(gè)方便的UI線程包,大大的簡(jiǎn)化了很多底層復(fù)雜的東西.先看看幾個(gè)簡(jiǎn)單的概念.

  1.SWT UI線程

  SWT用的是操作系統(tǒng)直接支持的線程模式,程序會(huì)在主程序里運(yùn)行一個(gè)時(shí)間循環(huán)并依次在這個(gè)線程里響應(yīng)事件.看下面這段代碼,UI線程就是創(chuàng)建Display的那個(gè)線程.

public static void main (String [] args) {
      Display display = new Display ();
      Shell shell = new Shell (display);
      shell.open ();
      // 開(kāi)始事件循環(huán)
      // 關(guān)掉窗口后
      while (!shell.isDisposed ()) {
         if (!display.readAndDispatch ())
            display.sleep ();
      }
      display.dispose ();
   }

  簡(jiǎn)單的小程序里,一個(gè)UI線程就能夠滿足需要了。但假如是長(zhǎng)時(shí)間的操作,你就最好不要用UI線程來(lái)做這些事,可以交給Job去做.它其實(shí)就是另外啟動(dòng)的線程,也就是等會(huì)我要說(shuō)的非UI線程.

  2、Job

  Job類由org.eclipse.core.runtime插件提供.它能夠讓客戶程序員輕松的在另外的線程中執(zhí)行代碼。看一個(gè)小例子:

  Job job = new Job("My First Job") {
     PRotected IStatus run(IProgressMonitor monitor) {
           System.out.println("Hello World (from a background job)");
           return Status.OK_STATUS;
        }
     };
  job.setPriority(Job.SHORT);
  job.schedule(); // start as soon as possible

  Job的默認(rèn)優(yōu)先級(jí)是Job.Long,這里例子中的優(yōu)先級(jí)要比它高,只要調(diào)用Job#schedule(),它就會(huì)盡快在另外的線程中運(yùn)行run()中的代碼。再看一個(gè)小例子:

final Job job = new Job("Long Running Job") {
        protected IStatus run(IProgressMonitor monitor) {
           try {
              while(hasMoreWorkToDo()) {
                 // do some work
                 // ...
              if (monitor.isCanceled()) return Status.CANCEL_STATUS;
             }
              return Status.OK_STATUS;
           } finally {
              schedule(60000); // start again in an hour
           }
        }
     };
  job.addJobChangeListener(new JobChangeAdapter() {
        public void done(IJobChangeEvent event) {
        if (event.getResult().isOK())
           postMessage("Job completed sUCcessfully");
           else
              postError("Job did not complete successfully");
        }
     });
  job.setSystem(true);
     job.schedule(); // start as soon as possible



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇赉县| 临泽县| 定西市| 兴安县| 崇仁县| 新兴县| 合水县| 久治县| 城固县| 县级市| 萨迦县| 新龙县| 宜宾市| 商丘市| 鱼台县| 德清县| 寿光市| 陇川县| 崇义县| 吉木萨尔县| 襄城县| 马边| 德兴市| 文昌市| 吉隆县| 台东县| 黄浦区| 弥勒县| 南投县| 台北县| 金塔县| 泸西县| 儋州市| 海口市| 延津县| 佳木斯市| 富裕县| 疏附县| 阿拉善盟| 神池县| 纳雍县|