xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
java语言从其诞生到现在不过短短五年时间,却已经成为全球最热门的语言,java程序员正成为it业其它程序员中薪金最高的职员。这一切都应归功于java良好的特性:简单、面向对象、分布式、平台无关性、可移植性、支持多线程等等。本文将用java的多线程特性来实现线程等待提示框。
1、问题的提出
在java应用程序编程中,有时需要在gui(图形化用户界面)中处理一些占用系统资源较多,耗费时间较长的事务,例如:与数据库进行大批量数据交换、大数据量的复杂运算、远程连接服务器等等。系统在处理这些事务时,如果还是使用gui所在的线程,会导致界面冻结,无法刷新,看起来好象系统已经崩溃,这是一个良好的软件系统不允许出现的局面。
2、解决问题的途径
解决上述问题的方法就是采用java的多线程特性,为这些耗时又耗资源的事务再开一个线程单独运行,并在gui处出现提示框“正在执行,请等待”,在线程结束时自动关闭该提示框。这样即避免了上面出现的界面冻结情况,又保证了线程的安全性,是软件开发者上佳的选择。
3、具体实现
(1)例子
这里举一个简单的例子来介绍如何用java实现线程等待提示框。
此例实现一个很简单的gui,根窗体testframe是一个jframe(框架)类,在testframe中放置一个jpanel(面板):testpanel ,最后将一个jbutton(按钮):testbutton添加到testpanel中。
按下testbutton,系统开始运行一个模拟的耗时又耗资源的事务:在标准输出设备上显示从1到100000,同时出现“线程正在运行”提示框,一旦事务完成(即线程结束),系统自动关闭该提示框。
(2)实现方法
为了达到上述功能,可以这样来实现:
当按下按钮后,启动一个新的线程来完成事务,即在标准输出设备上显示从1到100000(在代码中通过testthread类来实现),紧接着再启动一个线程来显示“线程正在运行”提示框(在代码中通过threaddiag类来实现)。
为了使提示框在testthread结束后,自行关闭,在testthread启动后,还启动了一个disposediag线程,这个线程专门用来等待testthread线程结束后,关闭“线程正在运行”提示框。
(3)程序代码及注释
① testframe类
testframe是java运行主程序,用来显示用户界面。
import javax.swing.*;import java.awt.*;import java.awt.event.*;public class testframe extends jframe{//gui所需组件public jpanel testpanel = null;public jbutton testbutton = null;public jframe testframe = null;public testframe(){//设置gui为windows风格try{uimanager.setlookandfeel("com.sun.java.swing.plaf.windows.windowslookandfeel");}catch (exception ex){system.out.println(“exception: ” + ex);}testframe = this;// 初始化guidimension dimensions = toolkit.getdefaulttoolkit().getscreensize();setsize(dimensions.width /2, dimensions.height /2);setlocation(dimensions.width/2-dimensions.width/4,dimensions.height/2-dimensions.height/4);testpanel = new jpanel();testbutton = new jbutton("开始线程");testpanel.add(testbutton);getcontentpane().add(testpanel);//增加按钮testbutton事件监听器testbutton.addactionlistener(new java.awt.event.actionlistener() {public void actionperformed(actionevent e) {testthread testthread = new testthread();//新生成一个处理事务线程testthread.start();//启动事务线程(new threaddiag(testframe, testthread ,"正在执行,请等待......")).start();//启动等待提示框线程}});//增加testframe事件监听器addwindowlistener(new windowadapter(){public void windowclosing(windowevent e) {system.exit(0);}});}public static void main(string[] args){//主程序testframe testframe2 = new testframe();testframe2.settitle("线程等待测试");testframe2.show();}}
② testthread类
testthread类是处理事务线程,即在标准输出设备上显示从1到100000。
public class testthread extends thread{public void run(){for (int i = 1; i < 100000 ; i++ ){system.out.println(i);}}}
③ threaddiag类
threaddiag类用来显示“线程正在运行”提示框。
import java.awt.*;import javax.swing.*;public class threaddiag extends thread{private thread currentthread = null;//实际调用时就是testthread事务处理线程private string messages = "";//提示框的提示信息private jframe parentframe = null;//提示框的父窗体private jdialog cluediag = null;// “线程正在运行”提示框private dimension dimensions = toolkit.getdefaulttoolkit().getscreensize();private int width = dimensions.width / 4, height = 60;private int left = 0, top = 0;public threaddiag(jframe parentframe, thread currentthread, string messages){this.parentframe = parentframe;this.currentthread = currentthread;this.messages = messages;initdiag();//初始化提示框}protected void initdiag(){cluediag = new jdialog(parentframe,"正在执行,请等待...",true);cluediag.setcursor(new cursor(cursor.wait_cursor));jpanel testpanel = new jpanel();jlabel testlabel = new jlabel(messages);cluediag.getcontentpane().add(testpanel);testpanel.add(testlabel);(new disposediag()).start();//启动关闭提示框线程}public void run(){//显示提示框int left = (dimensions.width - width)/2;int top = (dimensions.height - height)/2;cluediag.setsize(new dimension(width,height));cluediag.setlocation(left, top);cluediag.show();}}
④ disposediag类
disposediag类用来关闭提示框
class disposediag extends thread{public void run(){try{currentthread.join();//等待事务处理线程结束}catch(interruptedexception e){system.out.println("exception:" + e);}cluediag.dispose();//关闭提示框}
}
注:为了共用变量cluediag,上述threaddiag类和disposediag类放在同一个java文件内,如果分开存放,只需传递一下参数即可。
上述程序在jdk1.3下运行通过。
(4)程序运行结果
运行结果如下图所示:
xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
当事务执行完后,“正在执行”提示框自动关闭。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器