仓酷云

标题: 来看针对用户界面的多线程 [打印本页]

作者: 若相依    时间: 2015-1-18 11:35
标题: 来看针对用户界面的多线程
先谈谈我对java的一些认识。我选择java,是因为他语法简单,功能强大,从web,到桌面,到嵌入式,无所不能。但当我进一步了解了java后,感叹,java原来也有许多缺点。
如今,我们大概能用一个线程办理在Counter1.java中呈现的成绩。接纳的一个技能即是在一个线程的run()办法中安排“子义务”——亦即位于go()内的轮回。一旦用户按下Start按钮,线程就会启动,但即刻停止线程的创立。如许一来,只管线程仍在运转,但程序的次要事情却能得以持续(期待并呼应用户界面的事务)。上面是详细的代码:
  1. //:Counter2.java
  2. //Aresponsiveuserinterfacewiththreads
  3. importjava.awt.*;
  4. importjava.awt.event.*;
  5. importjava.applet.*;
  6. classSeparateSubTaskextendsThread{
  7. privateintcount=0;
  8. privateCounter2c2;
  9. privatebooleanrunFlag=true;
  10. publicSeparateSubTask(Counter2c2){
  11. this.c2=c2;
  12. start();
  13. }
  14. publicvoidinvertFlag(){runFlag=!runFlag;}
  15. publicvoidrun(){
  16. while(true){
  17. try{
  18. sleep(100);
  19. }catch(InterruptedExceptione){}
  20. if(runFlag)
  21. c2.t.setText(Integer.toString(count++));
  22. }
  23. }
  24. }
  25. publicclassCounter2extendsApplet{
  26. TextFieldt=newTextField(10);
  27. privateSeparateSubTasksp=null;
  28. privateButton
  29. onOff=newButton("Toggle"),
  30. start=newButton("Start");
  31. publicvoidinit(){
  32. add(t);
  33. start.addActionListener(newStartL());
  34. add(start);
  35. onOff.addActionListener(newOnOffL());
  36. add(onOff);
  37. }
  38. classStartLimplementsActionListener{
  39. publicvoidactionPerformed(ActionEvente){
  40. if(sp==null)
  41. sp=newSeparateSubTask(Counter2.this);
  42. }
  43. }
  44. classOnOffLimplementsActionListener{
  45. publicvoidactionPerformed(ActionEvente){
  46. if(sp!=null)
  47. sp.invertFlag();
  48. }
  49. }
  50. publicstaticvoidmain(String[]args){
  51. Counter2applet=newCounter2();
  52. FrameaFrame=newFrame("Counter2");
  53. aFrame.addWindowListener(
  54. newWindowAdapter(){
  55. publicvoidwindowClosing(WindowEvente){
  56. System.exit(0);
  57. }
  58. });
  59. aFrame.add(applet,BorderLayout.CENTER);
  60. aFrame.setSize(300,200);
  61. applet.init();
  62. applet.start();
  63. aFrame.setVisible(true);
  64. }
  65. }///:~
复制代码
如今,Counter2酿成了一个相称间接的程序,它的独一义务就是设置并办理用户界面。但倘使用户如今按下Start按钮,却不会真正挪用一个办法。此时不是创立类的一个线程,而是创立SeparateSubTask,然后持续Counter2事务轮回。注重此时会保留SeparateSubTask的句柄,以便我们按下onOff按钮的时分,能一般地切换位于SeparateSubTask外部的runFlag(运转标记)。随后谁人线程即可启动(当它看到标记的时分),然后将本人中断(亦可将SeparateSubTask设为一个外部类来到达这一目标)。
SeparateSubTask类是对Thread的一个复杂扩大,它带有一个构建器(个中保留了Counter2句柄,然后经由过程挪用start()来运转线程)和一个run()——实质上包括了Counter1.java的go()内的代码。因为SeparateSubTask晓得本人包容了指向一个Counter2的句柄,以是可以在必要的时分参与,并会见Counter2的TestField(文本字段)。
按下onOff按钮,几近当即能失掉准确的呼应。固然,这个呼应实在并非“当即”产生的,它究竟和那种由“中止”驱动的体系分歧。只要线程具有CPU的实行工夫,并注重到标志已产生改动,计数器才会中断。

1.用外部类改良代码
上面说说题外话,请人人注重一下SeparateSubTask和Counter2类之间产生的分离举动。SeparateSubTask同Counter2“亲热”地分离到了一同——它必需持有指向本人“父”Counter2对象的一个句柄,以便本人能回协调利用它。但两个类并非真的兼并为独自一个类(只管鄙人一节中,我们会讲到Java的确供应了兼并它们的办法),由于它们各自做的是分歧的事变,并且是在分歧的工夫创立的。但不论如何,它们仍然严密地分离到一同(更正确地说,应当叫“团结”),以是使程序代码几显得有些愚笨。在这类情形下,一个外部类能够明显改良代码的“可读性”和实行效力:
  1. //:Counter2i.java
  2. //Counter2usinganinnerclassforthethread
  3. importjava.awt.*;
  4. importjava.awt.event.*;
  5. importjava.applet.*;
  6. publicclassCounter2iextendsApplet{
  7. privateclassSeparateSubTaskextendsThread{
  8. intcount=0;
  9. booleanrunFlag=true;
  10. SeparateSubTask(){start();}
  11. publicvoidrun(){
  12. while(true){
  13. try{
  14. sleep(100);
  15. }catch(InterruptedExceptione){}
  16. if(runFlag)
  17. t.setText(Integer.toString(count++));
  18. }
  19. }
  20. }
  21. privateSeparateSubTasksp=null;
  22. privateTextFieldt=newTextField(10);
  23. privateButton
  24. onOff=newButton("Toggle"),
  25. start=newButton("Start");
  26. publicvoidinit(){
  27. add(t);
  28. start.addActionListener(newStartL());
  29. add(start);
  30. onOff.addActionListener(newOnOffL());
  31. add(onOff);
  32. }
  33. classStartLimplementsActionListener{
  34. publicvoidactionPerformed(ActionEvente){
  35. if(sp==null)
  36. sp=newSeparateSubTask();
  37. }
  38. }
  39. classOnOffLimplementsActionListener{
  40. publicvoidactionPerformed(ActionEvente){
  41. if(sp!=null)
  42. sp.runFlag=!sp.runFlag;//invertFlag();
  43. }
  44. }
  45. publicstaticvoidmain(String[]args){
  46. Counter2iapplet=newCounter2i();
  47. FrameaFrame=newFrame("Counter2i");
  48. aFrame.addWindowListener(
  49. newWindowAdapter(){
  50. publicvoidwindowClosing(WindowEvente){
  51. System.exit(0);
  52. }
  53. });
  54. aFrame.add(applet,BorderLayout.CENTER);
  55. aFrame.setSize(300,200);
  56. applet.init();
  57. applet.start();
  58. aFrame.setVisible(true);
  59. }
  60. }///:~
复制代码
这个SeparateSubTask名字不会与前例中的SeparateSubTask抵触——即便它们都在不异的目次里——由于它已作为一个外部类埋没起来。人人亦可看到外部类被设为private(公有)属性,这意味着它的字段和办法都可取得默许的会见权限(run()除外,它必需设为public,由于它在基本类中是公然的)。除Counter2i以外,其他任何方面都不成会见private外部类。并且因为两个类严密分离在一同,以是很简单放宽它们之间的会见限定。在SeparateSubTask中,我们可看到invertFlag()办法已被删往,由于Counter2i如今能够间接会见runFlag。
别的,注重SeparateSubTask的构建器已失掉了简化——它如今独一的用外就是启动线程。Counter2i对象的句柄仍象之前那样得以捕捉,但不再是经由过程野生传送和援用内部对象来到达这一目标,此时的外部类机制能够主动照顾它。在run()中,可看到对t的会见是间接举行的,仿佛它是SeparateSubTask的一个字段。父类中的t字段如今能够酿成private,由于SeparateSubTask能在未获任何特别允许的条件下自在地会见它——并且不管怎样都该尽量地把字段酿成“公有”属性,以防来自类外的某种力气失慎地改动它们。
不管在甚么时分,只需注重到类互相之间分离得对照严密,便可思索使用外部类来改良代码的编写与保护。
先说优点,首先和C,C++这些语言比起来,java很简单,去掉指针的java,非常好理解,自动垃圾回收机制也很好,自从JDK1.5推出以后,性能上又有了很大提高。
作者: 分手快乐    时间: 2015-1-21 10:35
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者: 金色的骷髅    时间: 2015-1-24 11:22
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
作者: 第二个灵魂    时间: 2015-2-1 06:50
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者: 简单生活    时间: 2015-2-7 01:28
是一种语言,用以产生「小应用程序(Applet(s))
作者: 兰色精灵    时间: 2015-2-8 19:50
是一种使网页(Web Page)产生生动活泼画面的语言
作者: 柔情似水    时间: 2015-2-12 02:22
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者: 不帅    时间: 2015-2-27 06:19
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 老尸    时间: 2015-3-8 22:48
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 灵魂腐蚀    时间: 2015-3-16 16:25
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
作者: 再见西城    时间: 2015-3-22 23:21
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 乐观    时间: 2015-3-27 00:44
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 因胸联盟    时间: 2015-3-29 04:32
是一种为 Internet发展的计算机语言
作者: 谁可相欹    时间: 2015-4-11 21:10
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
作者: 只想知道    时间: 2015-4-17 04:18
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 仓酷云    时间: 2015-4-25 10:14
Java是一种计算机编程语言,拥有跨平台、面向对java
作者: 愤怒的大鸟    时间: 2015-5-6 21:09
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者: 变相怪杰    时间: 2015-5-11 03:44
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者: 小女巫    时间: 2015-6-20 23:46
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
作者: 飘飘悠悠    时间: 2015-6-23 21:52
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者: 活着的死人    时间: 2015-7-11 09:55
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。




欢迎光临 仓酷云 (http://www.ckuyun.com/) Powered by Discuz! X3.2