怎么解决这个新终止当前线程的运行和主终止当前线程的运行运行先后的问题

需求如下:有一个Form类:UI(主线程)一个Thread类:ThreadA现在要求在UI中调用ThreadA,等A调用完成后接着执行UI下面的部分,同时这个时候UI界面不能够挂死读了各种关于委托和INVOKE的内容,大多数是讲怎么跨线程设置控件,我这个感觉相对简单的实现在网上怎么搜也搜不到=。=试过ThreadA.join(),这个会让界面挂死,不行的其实线程A的目的就是复制几个文件,如果能做到复制的时候不让界面挂死,不用线程也罢。不过最主要的还是想掌握这种方法求各位大神支招Orz
--------------------------------------
UI又要等,又不想挂起,那只能是做DoEvent不过这种设计不是很合理,正常应该是后台线程做事,然后通知UI刷新。这样就没有等待这一说了
--------------------------------------
其实,不知道你想干什么。难道你是说的不是异步?
--------------------------------------
引用 1 楼 wddw1986 的回复:UI又要等,又不想挂起,那只能是做DoEvent不过这种设计不是很合理,正常应该是后台线程做事,然后通知UI刷新。这样就没有等待这一说了说的很合理,lz这个需求就是有问题的!
--------------------------------------
引用 1 楼 wddw1986 的回复:UI又要等,又不想挂起,那只能是做DoEvent不过这种设计不是很合理,正常应该是后台线程做事,然后通知UI刷新。这样就没有等待这一说了+1public bool running =public void Foo(){
new Thread((ThreadStart)delegate
//some code to delay
}.Start();//模拟你线程
while(running)
Application.DoEvents();
Thread.Sleep(1);
--------------------------------------
澄清下,需求是这样的:public class UI:Form{
public void mainProc()
//XXXX处理
//启动线程A
Thread a = new Thread(new ThreadStart(ThreadAProc));
a.start();
//执行函数B
//以下略去
}}现在的问题是,B不能扔到A所在的线程中去处理,而且必须要等A执行完了才能够执行B,就算把B也扔给一个后台线程去处理,A和B之间还是得有先后关系的。这样该怎么实现?4楼的方法我先去试一试哈
--------------------------------------
不知道我说清楚了没,就说两个过程的处理是有先后顺序之分的,并且这两个过程不能放到同一个线程中去处理。这种结构的话,有其他好的方法么?
--------------------------------------
现在能想到的最好的方法是等A线程执行结束了以后发给消息给主线程,然后主线程开始调用接下来的函数。但这个我不知道代码怎么实现。。。
--------------------------------------
...简单点吧,有封装好的控件。用BackgroundWorker控件执行线程方法。订阅RunWorkerCompleted事件,然后写你想要线程结束后执行的方法。
--------------------------------------
楼主的需求并不奇怪,我有做过类似的,实现的东西如下:全国有很多销售点,1、要统计各大区的销售情况2、要汇总全国的总销售量。因为点多、量大,单一线程计算缓慢,而且远程取数会因为原因,可能不能一次性取全。使用线程池计算,单一线程汇总一地区数据,大区中的所有地区计算完毕后才能计算该大区销售量,当所有大区销售量统计完成后,才能计算全国销售量。点击计算,UI出现Loding... 这个时候你可以做点其他不想干的事情。当完成后,“当”一下,提醒你。楼主的问题重点应该是B线程怎么知道A线程执行完了,才对。
--------------------------------------
能再具体点么?最好有代码什么的引用 8 楼 ariesget 的回复:...简单点吧,有封装好的控件。用BackgroundWorker控件执行线程方法。订阅RunWorkerCompleted事件,然后写你想要线程结束后执行的方法。
--------------------------------------
对对对,就是这个意思9楼深得我心啊,求具体实现引用 9 楼 icdbow 的回复:楼主的需求并不奇怪,我有做过类似的程序,实现的东西如下:全国有很多销售点,1、要统计各大区的销售情况2、要汇总全国产品的总销售量。因为点多、量大,单一线程计算缓慢,而且远程取数会因为网络原因,可能不能一次性取全。使用线程池计算,单一线程汇总一地区数据,大区中的所有地区计算完毕后才能计算该大区销售量,当所有大区销售量统计完成后,才能计算全国销售量。点击计算,UI出现Loding... 这个时候你可以做点其他不想干的事情。当完成后,“当”一下,提醒你。楼主的问题重点应该是B线程怎么知道A线程执行完了,才对。
--------------------------------------
太久远印象不深了,刚才我找了我网盘上的代码,似乎不是我最终版本的实现方法1、用单一线程来跑,这样计算完A接着计算B,简单,容易实现。2、似乎是用后台线程WaitHandle.WaitAll,线程池,完成后执行(肯定不是这个了,我记得VS2010有个新属性,直接记录要执行的行,完成了就直接是0了,网上是没有,我那时想改进方法,看帮助找到的)2相对1资源应用合理些,效率高些。
--------------------------------------
引用 10 楼 Smellyfish 的回复:能再具体点么?最好有代码什么的Quote: 引用 8 楼 ariesget 的回复:...简单点吧,有封装好的控件。用BackgroundWorker控件执行线程方法。订阅RunWorkerCompleted事件,然后写你想要线程结束后执行的方法。BackgroundWorker backWork= new BackgroundWorker();backWork.DoWork += (o, ee) =&
复制文件方法;
};backWork.RunWorkerCompleted += (o, ee) =&
线程结束后继续执行的方法;
};backWork.RunWorkerAsync();
--------------------------------------
"()=&"这个叫做什么?我回去学习下
--------------------------------------
引用 14 楼 Smellyfish 的回复:"()=&"这个叫做什么?我回去学习下lambda、你用委托函数一样的。只是我习惯了用lambda。
--------------------------------------
引用 14 楼 Smellyfish 的回复:"()=&"这个叫做什么?我回去学习下你在VS里用这方法backWork.RunWorkerCompleted +然后Tab 2下就自动生成委托函数了。在生成的委托函数里写你的方法一样。
--------------------------------------
昨天试了一下BackgroundWorker,搞定了,多谢楼上几位大大提供思路哈,结贴,散分!
--------------------------------------
.net4或以上有个 .thread.tasks.task类,可以连续多个任务执行,应该能满足你的要求
--------------------------------------
a线程做完后发个消息给主线程,主线程处理消息的时候执行B
--------------------------------------
有一个Form类:UI(主线程)将UI主线程函数分拆为两段代码(即拆分为两个分别定义的函数)UI主线程第一段代码函数(){
创建线程;}创建线程ThreadA(){
线程执行完毕;
调用UI主线程第二段代码函数;}UI主线程第二段代码函数(){
//TODO...}
--------------------------------------
调用api waitobject
--------------------------------------
--------------------------------------
引用 楼主 Smellyfish 的回复:需求如下:有一个Form类:UI(主线程)一个Thread类:ThreadA现在要求在UI中调用ThreadA,等A调用完成后接着执行UI下面的代码部分,同时这个时候UI界面不能够挂死读了各种关于委托和INVOKE的内容,大多数是讲怎么跨线程设置控件,我这个感觉相对简单的实现在网上怎么搜也搜不到=。=试过ThreadA.join(),这个会让界面挂死,不行的其实线程A的目的就是复制几个文件,如果能做到复制的时候不让界面挂死,不用线程也罢。不过最主要的还是想掌握这种方法求各位大神支招Orz需求很简单啊。你在主线程里通过异步的方式调用你要执行的方法,然后再回调函数里通知主线程已经完成。我这里有一个方法,通过委托的方式,执行指定方法,可以设置等待时间,等待时间结束后,强制结束。就相当于超时控制。要执行的方法是异步的,不会影响主线程,而且还可以控制超时时间。using Susing System.Collections.Gusing System.Tusing System.TmonLib{
public delegate void DoHandler();
public class ComReadTimeout
private ManualResetEvent mTimeoutO
//标记变量
private bool mBoT
public DoHandler Do;
public ComReadTimeout()
初始状态为 停止
this.mTimeoutObject = new ManualResetEvent(true);
///&summary&
/// 指定超时时间 异步执行某个方法
///&/summary&
///&returns&执行 是否超时&/returns&
public bool DoWithTimeout(TimeSpan timeSpan)
if (this.Do == null)
this.mTimeoutObject.Reset();
this.mBoTimeout = //标记
this.Do.BeginInvoke(DoAsyncCallBack, null);
// 等待 信号Set
if (!this.mTimeoutObject.WaitOne(timeSpan, false))
this.mBoTimeout =
return !this.mBoT
///&summary&
/// 异步委托 回调函数
///&/summary&
///&param name="result"&&/param&
private void DoAsyncCallBack(IAsyncResult result)
this.Do.EndInvoke(result);
// 指示方法的执行未超时
this.mBoTimeout =
catch (Exception ex)
this.mBoTimeout =
this.mTimeoutObject.Set();
comReadTimeout = ReadTimeout();
//设置委托方法。
comReadTimeout.Do = ReadComD
//用法ConstMdl.iReadComTimeout 超时毫秒数
bool isTimeout = comReadTimeout.DoWithTimeout(new TimeSpan(0, 0, 0, 0, ConstMdl.iReadComTimeout));
--------------------------------------
BackgroundWorker
--------------------------------------
将UI代码放入委托.委托中使用invoke,将委托放入线程方法退出前.
--------------------------------------
用await试试http://msdn..com/zh-cn/library/vstudio/hh156528.aspx
--------------------------------------
引用 7 楼 Smellyfish 的回复:现在能想到的最好的方法是等A线程执行结束了以后发给消息给主线程,然后主线程开始调用接下来的函数。但这个我不知道代码怎么实现。。。这个思路可以的,1、在线程中设置一个事件,子线程运行完后,触发这个事件.事件的处理用委托。2、在主线程订阅上述事件,平且写事件处理函数。具体代码,请MSDN中搜索(利用事件类之间数据传递),有一个闹钟的范例!!借鉴下很容易解决的!!
--------------------------------------
// EventSample.cs.//namespace EventSample{
public class AlarmEventArgs : EventArgs
public int data1;
public int data2;
AlarmEventArgs(int x,int y)
public class AlarmClock
public event AlarmEventHandler A
public void Start()
while (true)
System.Threading.Thread.Sleep(1000);
AlarmEventArgs e = new AlarmEventArgs(10,11);
Alarm(this, e);
public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
public class WakeMeUp
public void AlarmRang(object sender, AlarmEventArgs e)
Console.WriteLine("事件响应!!!");
Console.WriteLine("X:{0} Y:{1}",e.data1 , e.data2);
public class AlarmDriver
public static void Main(string[] args)
// Instantiates the event receiver.
WakeMeUp w = new WakeMeUp();
// Instantiates the event source.
AlarmClock clock = new AlarmClock();
// Wires the AlarmRang method to the Alarm event.
clock.Alarm += new AlarmEventHandler(w.AlarmRang);
clock.Start();
System.Threading.Thread.Sleep(20000);
Console.ReadKey();
}}刚翻到我学习的时候,研究这短代码的 工程,索性给你贴出来。
--------------------------------------
引用 1 楼 wddw1986 的回复:UI又要等,又不想挂起,那只能是做DoEvent不过这种设计不是很合理,正常应该是后台线程做事,然后通知UI刷新。这样就没有等待这一说了DoEvent我试过,不是很好,“通知UI刷新”用事件?
--------------------------------------
我觉得用异步回调就可以了,线程那个结束后调用后面需要处理的方法
无相关信息查看: 71|回复: 1
【求助】多线程的启动顺序问题
阅读权限30
在线时间 小时
签到天数:15 天结帖率: (4/10)
发表于 昨天&23:43
多线程.png (201.21 KB, 下载次数: 0)
昨天&23:41 上传
按照教程中方式写出来的多线程样例,调试过程中打印的顺序为什么不对呢,求大神帮忙指点下,谢谢了,下面是源码。
昨天&23:42 上传
点击文件名下载附件
85.2 KB, 下载次数: 7
是不是要弄个许可证,,
回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至
可获得加分喔。友情提醒:本版被采纳的主题可在
帖子申请荣誉值,获得 1点 荣誉值,荣誉值可兑换终身vip用户组哦。快捷通道: →
阅读权限90
在线时间 小时
签到天数: 26 天结帖率: (51/56)
发表于 昨天&23:43
是不是要弄个许可证,,
您可以选择打赏方式支持他
精易论坛 - 有你更精彩 /2
官方承诺本勋章不超过12枚,只通过抽奖或者其他活动获得,本次抽奖是首枚,也有可能是独一枚哦.
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
防范网络诈骗,远离网络犯罪
违法和不良信息举报电话,企业QQ: ,邮箱:@
Powered by
粤公网安备 25Java主线程等待所有子线程执行完毕再执行解决办法集 - 推酷
Java主线程等待所有子线程执行完毕再执行解决办法集
Java主线程等待所有子线程执行完毕在执行,其实在我们的工作中经常的用到,比如说主线程要返回一个响应用户的值,但这个值得赋值过程是由过个子线程来完成的(模拟一个实际开发的情景),所以主线程必须等待子线程执行完毕,再响应用户;否则,响应用户的是一个无意义的值。
那么如何确保所有的子线程执行完毕了。一般的有如下方法:
1& 让主线程等待,或着睡眠几分钟。用Thread.sleep()或者TimeUnit.SECONDS.sleep(5);
package andy.thread.traditional.
import java.util.concurrent.TimeU
* @author Zhang,Tianyou
* @version 日 下午11:15:27
public class ThreadSubMain1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i = 0; i & 10; i++) {
new Thread(new Runnable() {
public void run() {
Thread.sleep(1000);
// 模拟子线程任务
} catch (InterruptedException e) {
System.out.println(&子线程& + Thread.currentThread() + &执行完毕&);
}).start();
// 等待全部子线程执行完毕
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println(&主线执行。&);
效果如下:
子线程Thread[Thread-1,5,main]执行完毕
子线程Thread[Thread-3,5,main]执行完毕
子线程Thread[Thread-5,5,main]执行完毕
子线程Thread[Thread-7,5,main]执行完毕
子线程Thread[Thread-9,5,main]执行完毕
子线程Thread[Thread-0,5,main]执行完毕
子线程Thread[Thread-2,5,main]执行完毕
子线程Thread[Thread-4,5,main]执行完毕
子线程Thread[Thread-6,5,main]执行完毕
子线程Thread[Thread-8,5,main]执行完毕
主线执行。
此方主线程只是睡了5秒,但是不能保证全部的子线程执行完成,所以这儿的5秒只是一个估值。
2 使用Thread的join()等待所有的子线程执行完毕,主线程在执行
实现 如下:
package andy.thread.traditional.
import java.util.V
* @author Zhang,Tianyou
* @version 日 下午11:15:27
public class ThreadSubMain2 {
public static void main(String[] args) {
// 使用线程安全的Vector
Vector&Thread& threads = new Vector&Thread&();
for (int i = 0; i & 10; i++) {
Thread iThread = new Thread(new Runnable() {
public void run() {
Thread.sleep(1000);
// 模拟子线程任务
} catch (InterruptedException e) {
System.out.println(&子线程& + Thread.currentThread() + &执行完毕&);
threads.add(iThread);
iThread.start();
for (Thread iThread : threads) {
// 等待所有线程执行完毕
iThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(&主线执行。&);
执行结果也是如下:
子线程Thread[Thread-1,5,main]执行完毕
子线程Thread[Thread-2,5,main]执行完毕
子线程Thread[Thread-0,5,main]执行完毕
子线程Thread[Thread-3,5,main]执行完毕
子线程Thread[Thread-4,5,main]执行完毕
子线程Thread[Thread-9,5,main]执行完毕
子线程Thread[Thread-7,5,main]执行完毕
子线程Thread[Thread-5,5,main]执行完毕
子线程Thread[Thread-8,5,main]执行完毕
子线程Thread[Thread-6,5,main]执行完毕
主线执行。
这种方式符合要求,它能够等待所有的子线程执行完,主线程才会执行。
ExecutorService
线程池,等待所有任务执行完毕再执行主线程,
(long timeout, unit)
请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行。
package andy.thread.traditional.
import java.util.concurrent.ExecutorS
import java.util.concurrent.E
import java.util.concurrent.TimeU
* @author Zhang,Tianyou
* @version 日 下午11:15:27
public class ThreadSubMain3 {
public static void main(String[] args) {
// 定义一个缓冲的线程值 线程池的大小根据任务变化
ExecutorService threadPool = Executors.newCachedThreadPool();
for (int i = 0; i & 10; i++) {
threadPool.execute(new Runnable() {
public void run() {
Thread.sleep(1000);
// 模拟子线程任务
} catch (InterruptedException e) {
System.out.println(&子线程& + Thread.currentThread() + &执行完毕&);
// 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。
threadPool.shutdown();
// 请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行
// 设置最长等待10秒
threadPool.awaitTermination(10, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(&主线执行。&);
执行结果如下:
子线程Thread[pool-1-thread-4,5,main]执行完毕
子线程Thread[pool-1-thread-1,5,main]执行完毕
子线程Thread[pool-1-thread-7,5,main]执行完毕
子线程Thread[pool-1-thread-6,5,main]执行完毕
子线程Thread[pool-1-thread-5,5,main]执行完毕
子线程Thread[pool-1-thread-2,5,main]执行完毕
子线程Thread[pool-1-thread-3,5,main]执行完毕
子线程Thread[pool-1-thread-8,5,main]执行完毕
子线程Thread[pool-1-thread-10,5,main]执行完毕
子线程Thread[pool-1-thread-9,5,main]执行完毕
主线执行。
这种方法和方法2一样,将等待所有子线程执行完毕之后才执行主线程。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 android 运行主线程 的文章

 

随机推荐