不帅 发表于 2015-1-18 11:12:46

JAVA编程:关于Eclipse中UI程序的线程的会商

最后我再次声明,我并没有说不看好java,实际上我对java很乐观的,毕竟她正在不断改进中,我相信她总有一天会和.net并驾齐驱的程序  固然各个操纵体系之间的线程机制是纷歧样的,可是大抵是不异的。当用户利用GUI程序时,假如点鼠标或按下键盘上的键等时,操纵体系会发生对应的GUI事务,它来决意哪一个窗口或程序来承受每个事务而且放到程序的事务行列中.

任何GUI程序的底层布局就是一个事务轮回.程序起首初始化事务轮回,并入手下手轮回,这个轮回会处置件行列顺次吸收GUI事务并逐一做出响应的反响.程序应当对事务做出疾速的反响使程序一向对用户有呼应,举个例子,用户点了一下程序里的一个按钮了局程序就没反响了,那末这个程序应当算是一个失利的程序吧.

假如某个UI事务激发了某个必要长工夫的事件,那末应当把它放到一个别的的独自的线程中,如许程序的谁人事务轮回就可以够即刻返来呼应用户的下一个操纵.线程长短常庞大的一个主题,假如处置的欠好很简单形成逝世锁等很糟的情形.还好,eclipse为我们开辟插件供应了一个便利的UI线程包,年夜年夜的简化了良多底层庞大的工具.先看看几个复杂的观点.

  1.SWTUI线程

  SWT用的是操纵体系间接撑持的线程形式,程序会在主程序里运转一个工夫轮回并顺次在这个线程里呼应事务.看上面这段代码,UI线程就是创立Display的谁人线程.

publicstaticvoidmain(String[]args){
Displaydisplay=newDisplay();
Shellshell=newShell(display);
shell.open();
//入手下手事务轮回
//关失落窗口后
while(!shell.isDisposed()){
if(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}

  复杂的小程序里,一个UI线程就可以够满意必要了。但假如是长工夫的操纵,你就最好不要用UI线程来做这些事,能够交给Job往做.它实在就是别的启动的线程,也就是等会我要说的非UI线程.
  2、Job

  Job类由org.eclipse.core.runtime插件供应.它可以让客户程序员轻松的在别的的线程中实行代码。看一个小例子:

Jobjob=newJob("MyFirstJob"){
protectedIStatusrun(IProgressMonitormonitor){
System.out.println("HelloWorld(fromabackgroundjob)");
returnStatus.OK_STATUS;
}
};
job.setPriority(Job.SHORT);
job.schedule();//startassoonaspossible
  Job的默许优先级是Job.Long,这里例子中的优先级要比它高,只需挪用Job#schedule(),它就会尽快在别的的线程中运转run()中的代码。再看一个小例子:

finalJobjob=newJob("LongRunningJob"){
protectedIStatusrun(IProgressMonitormonitor){
try{
while(hasMoreWorkToDo()){
//dosomework
//...
if(monitor.isCanceled())returnStatus.CANCEL_STATUS;
}
returnStatus.OK_STATUS;
}finally{
schedule(60000);//startagaininanhour
}
}
};
job.addJobChangeListener(newJobChangeAdapter(){
publicvoiddone(IJobChangeEventevent){
if(event.getResult().isOK())
postMessage("Jobcompletedsuccessfully");
else
postError("Jobdidnotcompletesuccessfully");
}
});
job.setSystem(true);
job.schedule();//startassoonaspossible
  monitor是一个进度显现条,它会在运转job时主动显现,假如义务乐成运转完成,前往Status.OK_STATUS,假如半途被用户在进度显现条那边中止,就前往Status.CANCEL_STATUS.下面schedule(60000);它是让job每过1小时就主动运转,Job又一个十分壮大的功效。然后前面是能够给job增加监听器,
job.setSystem(true);这一句是把这个job设置为体系级其余.假如挪用setUser(true),那末就被界说为用户级其余,用户级别和默许级其余job。

  在运转时会以UI情势反应出来,假如是用户job,那末会弹出一个进度显现窗口,能让用户选择在背景里运转,下图是一个job主动运转时的效果:



  再先容job经常用到的一个办法Job#join(),体系挪用到某个job,挪用它的run()办法。再看上面这个例子:

classTrivialJobextendsJob{
publicTrivialJob(){
super("TrivialJob");
}
publicIStatusrun(IProgressMonitormonitor){
System.out.println("Thisisajob");
returnStatus.OK_STATUS;
}
}

  job的创立和企图以下所示:
TrivialJobjob=newTrivialJob();
System.out.println("Abouttoscheduleajob");
job.schedule();
System.out.println("Finishedschedulingajob");

  他们的实行是和工夫不妨的,输入大概以下:

Abouttoscheduleajob
Thisisajob
Finishedschedulingajob
  也多是:
Abouttoscheduleajob
Finishedschedulingajob
Thisisajob

  假如但愿某个job运转完成后在持续时,可使用join()办法,join()会一向堵塞到该job运转完。

  例子:

TrivialJobjob=newTrivialJob();
System.out.println("Abouttoscheduleajob");
job.schedule();
job.join();
if(job.getResult().isOk())
System.out.println("Jobcompletedwithsuccess");
else
System.out.println("Jobdidnotcompletesuccessfully");
  下面的代码实行后,输入应当就是如许:
 Abouttoscheduleajob
Thisisajob
Jobcompletedwithsuccess
  Job的功效是很壮大的,另有良多功效我今后会先容,也能够查阅官方匡助文档,这里先把几个经常使用的成绩办理失落。拜见:

http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/runtime_jobs.htm
  3、假如在Job中加上改动UI的代码就会失利。缘故原由以下:

  假如是在非UI线程中挪用UI,SWT就会抛出一个SWTException,要在一个非UI线程改动UI的话有几种手艺:
  第一种,用:

Display#syncExec(Runnable)或
Diaplay#asyncExec(Runnable)
  第二种:

  已开辟了别的一种Job,就是UIJob,能够间接在它内里运转改动UI的代码,实在它就是在SWT的asyncExec()办法里运转的.一切承继UIJob的类应当覆写runInUIThread办法而不是run办法。
  3.关于进度显现

  在Jface中:

  org.eclipse.jface.operations包界说了一些接口用来在进度条下运转长工夫的义务。能够拜见:
http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/jface_operations.htm
  在eclipse插件和RCP开辟中:

  用户级其余job是互操纵性最强的,它不但可以让用户用Cancel键作废job,并且能够在Detail中展现详细情形,可是注重:

  Detail只会鄙人面两种办法中呈现:

  IProgressService#busyCursorWhile或
  IProgressService#runInUI

  1)IProgressService#busyCursorWhile的用法则子:

  注重这里的run()中做些和UI有关的事:

IProgressServiceprogressService=PlatformUI.getWorkbench().getProgressService();
progressService.busyCursorWhile(newIRunnableWithProgress(){
publicvoidrun(IProgressMonitormonitor){
//donon-UIwork
}
});

  效果:



  2)IProgressService#runInUI的用法则子:

  注重这里的run()中能够做些和UI有关的事。

progressService.runInUI(
PlatformUI.getWorkbench().getProgressService(),
newIRunnableWithProgress(){
publicvoidrun(IProgressMonitormonitor){
//doUIwork
}
},
Platform.getWorkspace().getRoot());

  效果:



  这里最初一个参数能够是null,大概是这个操纵的划定规矩,在这里我们是设定运转这个UI操纵时锁定事情台.

  加倍详细的能够拜见:

http://help.eclipse.org/help30/index.jsp?topic=/org.eclipse.platform.doc.isv/guide/workbench_jobs.htm
  别的,有多数时分,我们不想弹出一个进度条窗口,而是只在最底下的形态栏显现就能够了,很复杂,写本人的Job类时,在机关办法里加上一句:setUser(false);就能够了.

C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译)

不帅 发表于 2015-1-29 13:20:02

Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。

因胸联盟 发表于 2015-1-31 08:47:27

其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。

admin 发表于 2015-1-31 18:12:44

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

简单生活 发表于 2015-2-3 06:04:51

一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从

变相怪杰 发表于 2015-2-4 20:51:46

有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)

深爱那片海 发表于 2015-2-10 09:04:26

吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧

柔情似水 发表于 2015-3-6 13:22:46

你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。

若天明 发表于 2015-3-11 04:47:44

http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。

飘灵儿 发表于 2015-3-11 06:34:58

是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言

若相依 发表于 2015-3-17 22:43:14

Java 编程语言的风格十分接近C、C++语言。

金色的骷髅 发表于 2015-3-25 04:03:06

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
页: [1]
查看完整版本: JAVA编程:关于Eclipse中UI程序的线程的会商