请问如何等待一个线程结束然后返回运行结果?

Jobernowl 2011-07-07 09:50:48

public void start(Skill skill){
this.equipmentList.clear();
stopFlag=false;
boolean isequipment;
int[] SID=xml.getSIDByName(skill.getSkillname());
int[] skillNum=skill.getSkillnum();
for(int a=0;a<armsize;a++){
for(int b=0;b<bodysize;b++){
for(int c=0;c<headsize;c++){
for(int d=0;d<legsize;d++){
for(int e=0;e<wstsize;e++){
Equipment equipment=new Equipment(armList.get(a),bodyList.get(b),headList.get(c),legList.get(d),wstList.get(e),SID,skillNum);
isequipment=equipment.isequipment();
if(stopFlag) break;
if(isequipment){
this.equipmentList.add(equipment);
}
this.moveProgressBar(a);
}
}
}
}
}
System.out.println(this.getEquipmentList().size());
this.setButtonIsEnabled(true);
}


上面是我的计算方法 以下是我在开始按钮事件上开启一个线程调用计算方法

new Thread(){
public void run(){
se.start(skill);
}
}.start();

我本来打算单击开始按钮之后返回一个list的 但是不知道如何等待线程结束在执行下一步 下一步也是写在开始按钮事件的 步骤是点击开始 - 开始计算 - 返回计算结果 - 显示在界面上
我用swt做界面的 求大大能帮忙解答问题
...全文
1142 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
BearKin 2011-07-08
  • 打赏
  • 举报
回复
........真替开始那几楼的人伤心
bayougeng 2011-07-08
  • 打赏
  • 举报
回复
呵呵,我一行代码都没看,但是大概知道是什么意思。
楼主想多线程提高用户体验,但是又必须等按钮点击时间里的东西计算出来才能进行下一步。是这样吧?
我很少做界面,我觉得这种情况下,启动另外的线程做计算没有问题,但要把光标变沙漏,另外可以在状态栏上做点提示,或者显示进度条,让用户知道后台正在算,系统没有挂。这样就可以了。
Jobernowl 2011-07-07
  • 打赏
  • 举报
回复
呵呵 还有很多问题呀 还得花一些时间类解决了
Jobernowl 2011-07-07
  • 打赏
  • 举报
回复
好了 刚才在网上找到答案再加上一个初学者胡乱给我说了一下 我把代码都写在run里面了(解决了今天问的问题) 然后我又发现非主界面线程修改主界面的话会报异常Invalid thread access 然后找到解决办法http://hi.baidu.com/wangkaijiangg/blog/item/31514ea8556a38a0cb130c9c.html 以下是我的代码 分享一下吧

if(!display.isDisposed()){
Runnable search=new Runnable() {
public void run() {
se.start(skill);
equipmentList=se.getEquipmentList();
equipments.clear();
equipments.addAll(equipmentList);
int index=1;
int size=equipmentList.size();
Equipment equipment;
List<String[]> textList=new ArrayList<String[]>();
if(size==0){
messageBox.setText("温馨提示:-)");
messageBox.setMessage("很遗憾啊,没有搜到一件:-(");
messageBox.open();
}
else{
for(int i=0;i<size;i++){
equipment=equipmentList.get(i);
equipment.setTotalskills();
textList.add(new String[]{""+index,""+equipment.getTotaldef(),null,""+equipment.getSkills()});
index++;
}
for(String[] itemtext:textList){
item=new TableItem(tableresult,0);
item.setText(itemtext);
}
}
groupresult.setText("一共"+(index-1)+"件");
}
};
display.syncExec(search);
search.run();
}
Jobernowl 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 qybao 的回复:]
引用 6 楼 sasuke38 的回复:
引用 5 楼 qybao 的回复:
如果只是在按钮事件中等待线程结束,然后再继续做其他处理,那么像1L说的就可以了

Thread t = new Thread(){
public void run(){
se.start(skill);
}
};
t.start();
t.jion();
//然后再这里再继续写你的处理

你说的……
[/Quote]

不好意思啊 我的表达能力向来不好 我

equipmentList=sed.getEquipmentList();
equipments.clear();
equipments.addAll(equipmentList);
int index=1;
int size=equipmentList.size();
Equipment equipment;
List<String[]> textList=new ArrayList<String[]>();
if(size==0){
messageBox.setText("温馨提示:-)");
messageBox.setMessage("很遗憾啊,没有搜到一件:-(");
messageBox.open();
}
else{
for(int i=0;i<size;i++){
equipment=equipmentList.get(i);
equipment.setTotalskills();
textList.add(new String[]{""+index,""+equipment.getTotaldef(),null,""+equipment.getSkills()});
index++;
}
for(String[] itemtext:textList){
TableItem item=new TableItem(tableresult,0);
item.setText(itemtext);
}
}
groupresult.setText("一共"+(index-1)+"件");

我希望在start()方法执行后在执行这些操作 所以必须要获得那个list 至于为什么用线程调用获得list的方法 这是因为我的方法有时候会因为条件的不同执行方法可能会很久 所以既做了一个进度条显示方法执行了多少了 如果不用线程的话界面会卡死的
qybao 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sasuke38 的回复:]
引用 5 楼 qybao 的回复:
如果只是在按钮事件中等待线程结束,然后再继续做其他处理,那么像1L说的就可以了

Thread t = new Thread(){
public void run(){
se.start(skill);
}
};
t.start();
t.jion();
//然后再这里再继续写你的处理

你说的返回结果是线程返回一个结果,还是你的按钮事件……
[/Quote]
你的equipmentList是个成员变量,当你的thread执行结束,它应该也就有元素了,
所以t.jion以后,你就可以对equipmentList操作了,不过感觉这样,你这个线程有意义吗,跟直接调用有什么区别,如果你是多个线程同时执行,那么多个线程都往equipmentList追加元素,你能知道哪些元素是哪个线程的吗?
感觉没理解你的思路和本意,你再好好把问题捋一捋,然后再说详细一些。


Jobernowl 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 alexandertech 的回复:]
这样写:
Thread t = new Thread(){
public void run(){
se.start(skill);
}
};
t.start();
t.join();
List<Equipment> list=se.getEquipmentList();
[/Quote]

我试了 你这样不行的 就是一直卡住不动
飞跃颠峰 2011-07-07
  • 打赏
  • 举报
回复
这样写:
Thread t = new Thread(){
public void run(){
se.start(skill);
}
};
t.start();
t.join();
List<Equipment> list=se.getEquipmentList();
Jobernowl 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qybao 的回复:]
如果只是在按钮事件中等待线程结束,然后再继续做其他处理,那么像1L说的就可以了

Thread t = new Thread(){
public void run(){
se.start(skill);
}
};
t.start();
t.jion();
//然后再这里再继续写你的处理

你说的返回结果是线程返回一个结果,还是你的按钮事件要返回一个结果?

……
[/Quote]

Thread t = new Thread(){
public void run(){
se.start(skill);
}
};
t.start();
List<Equipment> list=se.getEquipmentList();


之前这样写来着 发现线程刚启动就执行List<Equipment> list=se.getEquipmentList();这句了 所以我不能在线程后从这里获得equipmentList。
Jobernowl 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 qybao 的回复:]
如果只是在按钮事件中等待线程结束,然后再继续做其他处理,那么像1L说的就可以了

Thread t = new Thread(){
public void run(){
se.start(skill);
}
};
t.start();
t.jion();
//然后再这里再继续写你的处理

你说的返回结果是线程返回一个结果,还是你的按钮事件要返回一个结果?

……
[/Quote]
我这个线程必须要在这个事件里面返回那个equipmentList这个集合 然后再在这个按钮事件里面对这个list处理,然后显示出结果来
qybao 2011-07-07
  • 打赏
  • 举报
回复
如果只是在按钮事件中等待线程结束,然后再继续做其他处理,那么像1L说的就可以了

Thread t = new Thread(){
public void run(){
se.start(skill);
}
};
t.start();
t.jion();
//然后再这里再继续写你的处理

你说的返回结果是线程返回一个结果,还是你的按钮事件要返回一个结果?



Jobernowl 2011-07-07
  • 打赏
  • 举报
回复
能不能请各位用代码详细解释一下呢 我刚接触线程不久 都不怎么会用的
龙四 2011-07-07
  • 打赏
  • 举报
回复
用Callable,not Runnable
huntor 2011-07-07
  • 打赏
  • 举报
回复
SwingWorker
飞跃颠峰 2011-07-07
  • 打赏
  • 举报
回复
用Thread.join()方法可等待至当前线程结束

50,531

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧