目前我在做一个C/S架构的Java应用,其中有一项查询操作非常耗时,可以增加个进度条以提高用户界面友好型.大体流程是这样的,在一个方法内
protected void action_queryButton()实行一个耗时的查询操作ArrayList alQuery = BuinessLogic.getQuery(); 此操作非常耗时,我把它抽出来放到一个线程中去做,具体是:先写个QueryDialog继承于JDialog,上面加入JProgressBar进度条,在初始化QueryDialog的过程中启动线程做费时查询,期间不断将查询进度消息返回给JDialogProgress中的 JProgressBar(这样用户可以看到进度条在不断刷新往前跑),最后查询结束,返回查询结果集alQuery(是一个ArrayList对象). 这一切都已实现,关键问题是当我启动线程执行费时查询操作时,主线程也继续往下执行,我的线程还没来得及返回结果集,主线程已经
将一个空引用赋给result了(ArrayList result = alQuery;)等我线程返回时,一切晚矣~~~主线程继续往下执行(当然会抛个空指针异常,呵呵)…我的最终目的也就没有达到.我的目的是让线程去执行费时操作,同时界面显示进度条不断刷新,等费时查询结束,进度条跑到100%,然后返回结果集给主线程下一行的ArrayList引用对象 result,这样我才算真正完成任务,事与愿违啊,线程启动后,主线程继续往下走,没有完成任务交接.实例伪代码我附上了,
protected ArrayList action_queryButton()
{ //主线程开始
.
.
.
.
// 新建查询对话框
QueryDialog queryDialog = new QueryDialog(topFrame, this.managerContext);
// 打开对话框:注意,我开始启动费时查询线程了.线程start方法我封装在queryDialog.showDialog(queryParam, iFrame)方法里,具体代码这
//里不提供了.
if (queryDialog.showDialog(queryParam, iFrame) != queryDialog.OPTION_OK)
{
// 用户取消 或者 异常
queryDialog.dispose();
queryDialog = null;
return;
}
/*获得查询参数:注意我上面开启了个线程,当线程还没结束,也就是说还没返回查询结果集时,主线程继续往下走,执行了下步操作调getQuery方法得到一个ArrayList空对象(因为此时线程没有走完,不可能返回真实查询结果),系统会抛个空指针*/
ArrayList result = queryDialog.getQuery();
setQueryManagerContext(tempParam);
queryDialog.dispose();
queryDialog = null;
//
.
.
.
.
return result;
}
我的解决方法是在开启查询线程后,让主线程停止不动,不让它往下走,等待查询结束QueryDialog对象返回查询结果集后,再让主线程继续下一步 ArrayList result = queryDialog.getQuery();这样,result就有值了,一切都OK. 请问谁有更好的解决办法? 如果不方便给出代码,说出思路也行,说错没关系,大家一起探讨共同进步嘛,呵呵.
2008年11月16日 12:08
今天的文章java 线程 进度条_关于Java进度条多线程调用问题,一个很实用的问题,希望熟悉多线程编程的高手看看…分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/27775.html