网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.开放源码-SMTP发信客户端 for Ja.
.如何用JDO开发数据库应用(1).
.从了解到深入——样式表几点分析.
.J2ME学习札记1.
.爪哇语言结构性模式之变压器模式.
.最新资讯 Java程序能原生支持Vis.
.设计模式在EJB中的应用(下).
.如何在 SPRING 中实现.
.Java SE 6.0 桌面.
.Java基础入门: 关于Java&nb.
.11本入门到精通J2EE书籍推荐.
.Drives 集合.
.建模的误区.
.屏保中的“曲线”解密技巧.
.Java Servelet API入门之 Servle.
.结合struts和hibernate 谈J2EE数.
.Java设计模式例子 FactoryMethod.
.一个实现长整型数相加减的小程序.
.制作多个线程.
.lastIndexOf 方法.

关于Eclipse中UI程序的线程的讨论

发表日期:2008-1-5



  虽然各个操作系统之间的线程机制是不一样的,但是大致是相同的。当用户使用GUI程序时,假如点鼠标或按下键盘上的键等时,操作系统会产生对应的GUI事件,它来决定哪个窗口或程序来接受每一个事件并且放到程序的事件队列中.

      任何GUI程序的底层结构就是一个事件循环.程序首先初始化事件循环,并开始循环,这个循环会从事件队列依次接收GUI事件并一一做出相应的反应.程序应该对事件做出快速的反应使程序一直对用户有响应,举个例子,用户点了一下程序里的一个按钮结果程序就没反应了,那么这个程序应该算是一个失败的程序吧.

      假如某个UI事件引发了某个需要长时间的事务,那么应该把它放到一个另外的单独的线程中,这样程序的那个事件循环就能够马上回来响应用户的下一个操作.线程是非常复杂的一个主题,假如处理的不好很轻易造成死锁等很糟糕的情况.

      还好,eclipse为我们开发插件提供了一个方便的UI线程包,大大的简化了很多底层复杂的东西.先看看几个简单的概念.

  1.SWT UI线程

  SWT用的是操作系统直接支持的线程模式,程序会在主程序里运行一个时间循环并依次在这个线程里响应事件.看下面这段代码,UI线程就是创建Display的那个线程.

public static void main (String [] args) {
      Display display = new Display ();
      Shell shell = new Shell (display);
      shell.open ();
      // 开始事件循环
      // 关掉窗口后
      while (!shell.isDisposed ()) {
         if (!display.readAndDispatch ())
            display.sleep ();
      }
      display.dispose ();
   }

  简单的小程序里,一个UI线程就能够满足需要了。但假如是长时间的操作,你就最好不要用UI线程来做这些事,可以交给Job去做.它其实就是另外启动的线程,也就是等会我要说的非UI线程.

  2、Job

  Job类由org.eclipse.core.runtime插件提供.它能够让客户程序员轻松的在另外的线程中执行代码。看一个小例子:

  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的默认优先级是Job.Long,这里例子中的优先级要比它高,只要调用Job#schedule(),它就会尽快在另外的线程中运行run()中的代码。再看一个小例子:

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


上一篇:EJB技术之旅(二) 人气:460
下一篇:J2EE开发框架发展简史 人气:678
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐