若相依 发表于 2015-1-18 11:35:12

来看针对用户界面的多线程

先谈谈我对java的一些认识。我选择java,是因为他语法简单,功能强大,从web,到桌面,到嵌入式,无所不能。但当我进一步了解了java后,感叹,java原来也有许多缺点。
如今,我们大概能用一个线程办理在Counter1.java中呈现的成绩。接纳的一个技能即是在一个线程的run()办法中安排“子义务”——亦即位于go()内的轮回。一旦用户按下Start按钮,线程就会启动,但即刻停止线程的创立。如许一来,只管线程仍在运转,但程序的次要事情却能得以持续(期待并呼应用户界面的事务)。上面是详细的代码:
//:Counter2.java
//Aresponsiveuserinterfacewiththreads
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.*;

classSeparateSubTaskextendsThread{
privateintcount=0;
privateCounter2c2;
privatebooleanrunFlag=true;
publicSeparateSubTask(Counter2c2){
this.c2=c2;
start();
}
publicvoidinvertFlag(){runFlag=!runFlag;}
publicvoidrun(){
while(true){
try{
sleep(100);
}catch(InterruptedExceptione){}
if(runFlag)
c2.t.setText(Integer.toString(count++));
}
}
}

publicclassCounter2extendsApplet{
TextFieldt=newTextField(10);
privateSeparateSubTasksp=null;
privateButton
onOff=newButton("Toggle"),
start=newButton("Start");
publicvoidinit(){
add(t);
start.addActionListener(newStartL());
add(start);
onOff.addActionListener(newOnOffL());
add(onOff);
}
classStartLimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
if(sp==null)
sp=newSeparateSubTask(Counter2.this);
}
}
classOnOffLimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
if(sp!=null)
sp.invertFlag();
}
}
publicstaticvoidmain(String[]args){
Counter2applet=newCounter2();
FrameaFrame=newFrame("Counter2");
aFrame.addWindowListener(
newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
aFrame.add(applet,BorderLayout.CENTER);
aFrame.setSize(300,200);
applet.init();
applet.start();
aFrame.setVisible(true);
}
}///:~
如今,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的确供应了兼并它们的办法),由于它们各自做的是分歧的事变,并且是在分歧的工夫创立的。但不论如何,它们仍然严密地分离到一同(更正确地说,应当叫“团结”),以是使程序代码几显得有些愚笨。在这类情形下,一个外部类能够明显改良代码的“可读性”和实行效力:
//:Counter2i.java
//Counter2usinganinnerclassforthethread
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.*;

publicclassCounter2iextendsApplet{
privateclassSeparateSubTaskextendsThread{
intcount=0;
booleanrunFlag=true;
SeparateSubTask(){start();}
publicvoidrun(){
while(true){
try{
sleep(100);
}catch(InterruptedExceptione){}
if(runFlag)
t.setText(Integer.toString(count++));
}
}
}
privateSeparateSubTasksp=null;
privateTextFieldt=newTextField(10);
privateButton
onOff=newButton("Toggle"),
start=newButton("Start");
publicvoidinit(){
add(t);
start.addActionListener(newStartL());
add(start);
onOff.addActionListener(newOnOffL());
add(onOff);
}
classStartLimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
if(sp==null)
sp=newSeparateSubTask();
}
}
classOnOffLimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
if(sp!=null)
sp.runFlag=!sp.runFlag;//invertFlag();
}
}
publicstaticvoidmain(String[]args){
Counter2iapplet=newCounter2i();
FrameaFrame=newFrame("Counter2i");
aFrame.addWindowListener(
newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
System.exit(0);
}
});
aFrame.add(applet,BorderLayout.CENTER);
aFrame.setSize(300,200);
applet.init();
applet.start();
aFrame.setVisible(true);
}
}///:~这个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:31

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

金色的骷髅 发表于 2015-1-24 11:22:12

另外编写和运行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:28

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

简单生活 发表于 2015-2-7 01:28:53

是一种语言,用以产生「小应用程序(Applet(s))

兰色精灵 发表于 2015-2-8 19:50:43

是一种使网页(Web Page)产生生动活泼画面的语言

柔情似水 发表于 2015-2-12 02:22:19

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

不帅 发表于 2015-2-27 06:19:25

Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。

老尸 发表于 2015-3-8 22:48:55

你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。

灵魂腐蚀 发表于 2015-3-16 16:25:56

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。

再见西城 发表于 2015-3-22 23:21:59

Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。

乐观 发表于 2015-3-27 00:44:54

是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能

因胸联盟 发表于 2015-3-29 04:32:35

是一种为 Internet发展的计算机语言

谁可相欹 发表于 2015-4-11 21:10:34

另外编写和运行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:11

Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。

仓酷云 发表于 2015-4-25 10:14:48

Java是一种计算机编程语言,拥有跨平台、面向对java

愤怒的大鸟 发表于 2015-5-6 21:09:50

是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言

变相怪杰 发表于 2015-5-11 03:44:39

Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

小女巫 发表于 2015-6-20 23:46:02

那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!

飘飘悠悠 发表于 2015-6-23 21:52:43

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
页: [1] 2
查看完整版本: 来看针对用户界面的多线程