Java语言从其诞生到现在不过短短五年时间却已经成为全球最热门的语言Java程序员正成为IT业其它程序员中薪金最高的职员这一切都应归功于Java良好的特性简单面向对象分布式平台无关性可移植性支持多线程等等本文将用Java的多线程特性来实现线程等待提示框
一问题的提出
在Java应用程序编程中有时需要在GUI(图形化用户界面)中处理一些占用系统资源较多耗费时间较长的事务例如与数据库进行大批量数据交换大数据量的复杂运算远程连接服务器等等系统在处理这些事务时如果还是使用GUI所在的线程会导致界面冻结无法刷新看起来好象系统已经崩溃这是一个良好的软件系统不允许出现的局面
二解决问题的途径
解决上述问题的方法就是采用Java的多线程特性为这些耗时又耗资源的事务再开一个线程单独运行并在GUI处出现提示框正在执行请等待在线程结束时自动关闭该提示框这样即避免了上面出现的界面冻结情况又保证了线程的安全性是软件开发者上佳的选择
三具体实现
()例子
这里举一个简单的例子来介绍如何用JAVA实现线程等待提示框
此例实现一个很简单的GUI根窗体testFrame是一个JFrame(框架)类在testFrame中放置一个JPanel(面板)testPanel 最后将一个JButton(按钮)testButton添加到testPanel中
按下testButton系统开始运行一个模拟的耗时又耗资源的事务在标准输出设备上显示从到同时出现线程正在运行提示框一旦事务完成(即线程结束)系统自动关闭该提示框
()实现方法
为了达到上述功能可以这样来实现
当按下按钮后启动一个新的线程来完成事务即在标准输出设备上显示从到(在代码中通过TestThread类来实现)紧接着再启动一个线程来显示线程正在运行提示框(在代码中通过ThreadDiag类来实现)
为了使提示框在TestThread结束后自行关闭在TestThread启动后还启动了一个DisposeDiag线程这个线程专门用来等待TestThread线程结束后关闭线程正在运行提示框
()程序代码及注释
① TestFrame类
TestFrame是Java运行主程序用来显示用户界面
import javaxswing*;
import javaawt*;
import javaawtevent*;
public class TestFrame extends JFrame
{
//GUI所需组件
public JPanel testPanel = null;
public JButton testButton = null;
public JFrame testFrame = null;
public TestFrame()
{
//设置GUI为windows风格
try
{
UIManagersetLookAndFeel(
comsunjavaswingplafwindowsWindowsLookAndFeel);
}
catch (Exception ex)
{
Systemoutprintln(Exception: + ex);
}
testFrame = this;
//初始化GUI
Dimension dimensions = ToolkitgetDefaultToolkit()getScreenSize();
setSize(dimensionswidth / dimensionsheight /);
setLocation(dimensionswidth/dimensionswidth/
dimensionsheight/dimensionsheight/);
testPanel = new JPanel();
testButton = new JButton(开始线程);
testPaneladd(testButton);
getContentPane()add(testPanel);
//增加按钮testButton事件监听器
testButtonaddActionListener(new javaawteventActionListener() {
public void actionPerformed(ActionEvent e) {
TestThread testThread = new TestThread();//新生成一个处理事务线程
testThreadstart();//启动事务线程
(new ThreadDiag(testFrame testThread
正在执行请等待))start();//启动等待提示框线程
}
});
//增加testFrame事件监听器
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e) {
Systemexit();
}
});
}
public static void main(String[] args)
{
//主程序
TestFrame testFrame = new TestFrame();
testFramesetTitle(线程等待测试);
testFrameshow();
}
}
② TestThread类
TestThread类是处理事务线程即在标准输出设备上显示从到
public class TestThread extends Thread
{
public void run()
{
for (int i = ; i < ; i++ )
{
Systemoutprintln(i);
}
}
}
③ ThreadDiag类
ThreadDiag类用来显示线程正在运行提示框
import javaawt*;
import javaxswing*;
public class ThreadDiag extends Thread
{
private Thread currentThread = null;//实际调用时就是TestThread事务处理线程
private String messages = ;//提示框的提示信息
private JFrame parentFrame = null;//提示框的父窗体
private JDialog clueDiag = null;// 线程正在运行提示框
private Dimension dimensions = ToolkitgetDefaultToolkit()getScreenSize();
private int width = dimensionswidth / height = ;
private int left = top = ;
public ThreadDiag(JFrame parentFrame Thread currentThread String messages)
{
thisparentFrame = parentFrame;
thiscurrentThread = currentThread;
thismessages = messages;
initDiag();//初始化提示框
}
protected void initDiag()
{
clueDiag = new JDialog(parentFrame正在执行请等待true);
clueDiagsetCursor(new Cursor(CursorWAIT_CURSOR));
JPanel testPanel = new JPanel();
JLabel testLabel = new JLabel(messages);
clueDiaggetContentPane()add(testPanel);
testPaneladd(testLabel);
(new DisposeDiag())start();//启动关闭提示框线程
}
public void run()
{
//显示提示框
int left = (dimensionswidth width)/;
int top = (dimensionsheight height)/;
clueDiagsetSize(new Dimension(widthheight));
clueDiagsetLocation(left top);
clueDiagshow();
}
}
④ DisposeDiag类
DisposeDiag类用来关闭提示框
class DisposeDiag extends Thread
{
public void run()
{
try
{
currentThreadjoin();//等待事务处理线程结束
}
catch(InterruptedException e)
{
Systemoutprintln(Exception: + e);
}
clueDiagdispose();//关闭提示框
}
}
注为了共用变量clueDiag上述ThreadDiag类和DisposeDiag类放在同一个Java文件内如果分开存放只需传递一下参数即可
上述程序在jdk下运行通过
()程序运行结果
运行结果如下图所示
当事务执行完后正在执行提示框自动关闭