如何java 等待线程结束束

C# 等待线程结束-中国学网-中国IT综合门户网站
> C# 等待线程结束
C# 等待线程结束
转载 编辑:李强
为了帮助网友解决“C# 等待线程结束”相关的问题,中国学网通过互联网对“C# 等待线程结束”相关的解决方案进行了整理,用户详细问题包括:RT,我想知道:C# 等待线程结束,具体解决方案如下:解决方案1:使用 线程的 Join()方法可以通过对数据库的索引,我们还为您准备了:问:class Test { private bool flag= //flag是应用于t1线程函数中用于...答:使用 线程的 Join()方法可以===========================================问:for (int i = 0; i & 20; i++)//创建20个线程 { Thread thread = new Th...答:加一个全局变量,完成一个线程变量加1,当变量达到20,执行outTxt===========================================问:主线程创建了N个子线程,子线程分别访问网络获取数据,然后把获取的数据...答:利用异步回调技术,该你个简单的例子。 /// /// 开始接收数据 /// /// public bool StartRevice() { isRevice = ReviceDataHandler reviceData = new ReviceDataHandler(IsReviceAll); IAsyncResult asyncResult = reviceData.BeginInvok...===========================================问:代码段 for(int i=0;i&10;i++) { Thread Run = new Thread(new ThreadSt...答:弄成全局int j=0 ,在this.Start()最后面 j++ for(int i=0;i===========================================问:比如做一个form application,主程序引用一个类,这个类需要与用户交互,...答:另开一个线程执行用户输入等的操作,主线程无阻塞就能解决问题...先把用户的操作写成一方法如void write(){...};在需要执行用户输入操作的地方写: .... //以下为用户需要输入操作的地方,新开一线程执行write方法 Thread newThread=new Thread(new...===========================================问:Thread thrFrom = new Thread(new ParameterizedThreadStart(StaticHelp...答:没事别老Join。 你不如新开一个线程来监控其它线程的状态,这样还好些。===========================================问:主线程执行 。。。 线程1加入线程池 线程2加入线程池 线程3加入线程池 ...答:可以参见 WaitHandle.WaitAll 方法。 WaitHandle的命名空间是System.Thread。 可以为每一个线程创建一个 WaitHandle,比如: WaitHandle[] waitHandles = new WaitHandle[] { new AutoResetEvent(false), new AutoResetEvent(false), ... }; 然...===========================================问:我的要求是这样的,主程序Load的时候Start了一个新线程,这个线程一直在...答:有专门控制信号的两个类AutoResetEvent和ManualResetEvent 使用简单说明: 实例化对象 EventWaitHandle _waitHandle = new AutoResetEvent (false); 在线程函数中 while(true) { _waitHandle.WaitOne(); //事件发生后要做的任务 } 事件发生时...===========================================问:我在主线程中开辟一个子线程。然后当子线程结束后,主线程会作一个反应...答:使用异步回调,异步操作(使用线程池中的线程)完成后调用回调函数,在回调函数中修改子线程的操作状态即可。===========================================没事别老Join。你不如新开一个线程来监控其它线程的状态,这样还好些。===========================================使用 线程的 Join()方法可以===========================================AutoResetEvent(false), new AutoResetEvent(false), ... }; 然后在每条线程结束时,set与之相对应的那个 WaitHandle, 在主线程中,使用 WaitHandle.WaitAll方法来等待所有...===========================================newThread=new Thread(new ThreadStart write) //write为用户操作的方法名newThread.Start();//用户操作线程结束.... 需要导入using sys...===========================================最好采用委托,开辟另一个线程,在后台运行一些操作。这样就不至于等待的时候白屏,界面假死。如果对委托不太了解,我可以再给你举个例子:public delegate void weituoming();...===========================================Thread(new Runnable() { public void run() {startCheck(lock); } }).start();lock.await();等待//主线程继续执行startCheck方法里边如果执行完了之后,...=========================================== 不会。===========================================线程结束后再执行主线程"是不可能实现,你的意思应该是:主线程创建完子线程后,等待子... / 线程1 启动thread1.Join(); // 等待 线程1 退出,线程1 未...===========================================//启动线程Thread th = new Thread(Fun);th.Start(cbd);//开始线程,代入参数//线程执行的方法 参数是个委托, 线程中...===========================================线程等待数据接收(发送)完成,并生调用回调函数。 所以一般来说根本不需要使用Timer来检测执行过程。 建议使用异步的方法,异步使用线程池,减少创建/结束线程造成的性能...===========================================
本文欢迎转载,转载请注明:转载自中国学网: []
用户还关注
可能有帮助Java主线程等待所有子线程执行完毕再执行解决办法集 - 推酷
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个字符!
权限设置: 公开
仅自己可见如何等待一个已有线程自动结束的VC++代码 - 下载频道 - CSDN.NET
&&&&如何等待一个已有线程自动结束的VC++代码
&如何等待一个已有线程自动结束的VC++代码
如何等待一个已有线程自动结束的VC++代码!
值得下载看看!资源免费,大家分享!!
更多免费资源 http://ynsky.download.csdn.net/
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
评价资源返积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
开发技术下载排行
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
如何等待一个已有线程自动结束的VC++代码
所需积分:0
剩余积分:
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
VIP服务公告:/*&*&MTVERYFY.h*/#pragma&comment(&lib,&"USER32"&)#include&&crtdbg.h&#define&MTASSERT(a)&_ASSERTE(a)#define&MTVERIFY(a)&if&(!(a))&PrintError(#a,__FILE__,__LINE__,GetLastError())__inline&void&PrintError(LPSTR&linedesc,&LPSTR&filename,&int&lineno,&DWORD&errnum){&&&&LPSTR&lpB&&&&char&errbuf[256];#ifdef&_WINDOWS&&&&char&modulename[MAX_PATH];#else&//&_WINDOWS&&&&DWORD&#endif&//&_WINDOWS&&&&FormatMessage(&FORMAT_MESSAGE_ALLOCATE_BUFFER&&&&&&&&|&FORMAT_MESSAGE_FROM_SYSTEM,&&&&&&&&NULL,&&&&&&&&errnum,&&&&&&&&LANG_NEUTRAL,&&&&&&&&(LPTSTR)&lpBuffer,&&&&&&&&0,&&&&&&&&NULL&);&&&&wsprintf(errbuf,&"\nThe&following&call&failed&at&line&%d&in&%s:\n\n"&&&&&&&&"&&&&%s\n\nReason:&%s\n",&lineno,&filename,&linedesc,&lpBuffer);#ifndef&_WINDOWS&&&&WriteFile(GetStdHandle(STD_ERROR_HANDLE),&errbuf,&strlen(errbuf),&&numread,&FALSE&);&&&&Sleep(3000);#else&&&&GetModuleFileName(NULL,&modulename,&MAX_PATH);&&&&MessageBox(NULL,&errbuf,&modulename,&MB_ICONWARNING|MB_OK|MB_TASKMODAL|MB_SETFOREGROUND);#endif&&&&exit(EXIT_FAILURE);}
#include&&stdio.h&#include&&stdlib.h&#include&&Windows.h&#include&"MTVERIFY.h"#define&THREAD_POOL_SIZE&&3#define&NUM_TASKS&&&&6DWORD&WINAPI&ThreadFunc(LPVOID);int&main(){&&&&HANDLE&&&&hThreads[THREAD_POOL_SIZE];&&&&int&&&&&&&&i;&&&&int&&&&&&&&slot&=&0;&&&&DWORD&&&&dwThreadId;&&&&DWORD&&&&&&&&for&(&i=0;&i&NUM_TASKS;&i++&)&&&&{&&&&&&&&if&(&i&&=&THREAD_POOL_SIZE&)&&&&&&&&{&&&&&&&&&&&&rc&=&WaitForMultipleObjects(THREAD_POOL_SIZE,&hThreads,&FALSE,&INFINITE);&&&&&&&&&&&&slot&=&rc&-&WAIT_OBJECT_0;&&&&&&&&&&&&MTVERIFY(&0&=slot&&&&slot&THREAD_POOL_SIZE&);&&&&&&&&&&&&printf("Slot&%d&terminated.\n",slot);&&&&&&&&&&&&MTVERIFY(&CloseHandle(hThreads[slot])&);&&&&&&&&}&&&&&&&&MTVERIFY(&hThreads[slot++]&=&CreateThread(NULL,&0,&ThreadFunc,&(LPVOID)slot,&0,&&dwThreadId)&);&&&&&&&&printf("Launched&thread&#%d&(slot&%d).\n",&i,&slot);&&&&}&&&&rc&=&WaitForMultipleObjects(THREAD_POOL_SIZE,&hThreads,&TRUE,&INFINITE);&&&&MTVERIFY(&WAIT_OBJECT_0&=rc&&&&rc&WAIT_OBJECT_0+THREAD_POOL_SIZE&);&&&&&&&&for&(&slot=0;&slot&THREAD_POOL_SIZE;&slot++&)&&&&{&&&&&&&&MTVERIFY(&CloseHandle(hThreads[slot])&);&&&&}&&&&return&EXIT_SUCCESS;}DWORD&WINAPI&ThreadFunc(LPVOID&n){&&&&srand(&GetTickCount()&);&&&&Sleep(&(rand()%10)*800+500&);&&&&printf("Slot&%d&idle.\n",&n);&&&&return&(DWORD)n;}
阅读排行榜
评论排行榜页面导航:
→ 正文内容 Java并发之等待线程执行终止
Java并发编程示例(六):等待线程执行终止
这篇文章主要介绍了Java并发编程示例(六):等待线程执行终止,在本节,示例程序演示等待初始化方法完成后,再去执行其他任务,需要的朋友可以参考下
在某些场景下,我们必须等待线程执行完成才能进行下一步工作。例如,某些程序在开始执行之前,需要先初始化一些资源。这时,我们可以启动一个线程专门来做初始化任务,等到线程任务完成后,再去执行其他部分。
为此,Thread类为我们提供了join()方法。当我们使用线程对象调用此方法时,正在掉调用的线程对象将被推迟到被调用对象执行完成后再开始执行。
在本节,示例程序演示等待初始化方法完成后,再去执行其他任务。
按照下面所示步骤,完成示例程序。
1.创建一个名为DataSourcesLoader的类,并且实现Runnable接口。代码如下:
public class DataSourcesLoader implements Runnable {
2.实现run()方法,向控制台打印出一条信息以说明开始执行,然后睡眠4秒钟,再向控制台打印一条信息来说明线程执行结束。代码如下:
public void run() {
&&& System.out.printf("Beginning data sources loading: %s\n",
&&&&&&&&&&& new Date());
&&&&&&& TimeUnit.SECONDS.sleep(4);
&&& } catch (InterruptedException e) {
&&&&&&& e.printStackTrace();
&&& System.out.printf("Data sources loading has finished: %s\n",
&&&&&&&&&&& new Date());
3.创建一个名为NetworkConnectionsLoader的类,并且实现Runnable接口。 实现run()方法,该方法代码与DataSourcesLoader类的run()方法一样,只是这个睡眠6秒钟。
4.实现示例的主类,并且实现main()方法。代码如下:
public class Main {
&&& public static void main(String[] args) {
5.创建一个DataSourcesLoader对象,以及一个启动它执行的Thread对象。代码如下:
DataSourcesLoader dsLoader = new DataSourcesLoader();
Thread thread1 = new Thread(dsLoader, "DataSourcesLoader");
6.创建一个NetworkConnectionsLoader对象,以及一个启动它执行的Thread对象。代码如下:
NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
Thread thread2 = new Thread(ncLoader, "NetworkConnectionsLoader");
7.调用两个Thread对象的start()方法。代码如下:
thread1.start();
thread2.start();
8.调用join()方法,来等待两个线程完成其任务。这个方法会抛出InterruptedException异常,所以要捕获该异常。代码如下:
&&& thread1.join();
&&& thread2.join();
} catch (InterruptedException e) {
&&& e.printStackTrace();
9.向控制台打印一句话,表明程序执行结束。代码如下:
System.out.printf("Main: Configuration has been loaded: %s\n",
&&&&&&& new Date());
10.运行程序,查看执行效果。
知其所以然
当运行这个示例程序时,我们可以看到两个线程启动了它们的执行。首先,是DataSourcesLoader完成了它的执行;然后,是NetworkConnectionsLoader完成了它的执行。这时,主线程继续它的执行,然后向控制台打印出终止信息。
Java提供了另外两种重载的join()方法:
join(long milliseconds)
join(long milliseconds, long nanos)
第一种方式,不会直到被调用完成任务,而是等待参数指定的时间后就开始执行;例如,如果thread1调用该方法,thread1.join(1000),当thread1线程满足如下其中之一的条件就会继续执行:
1.thread2完成它的执行;
2.1000毫秒过后;
当这两个条件中的其中之一为真时,join()方法就会返回,开始继续执行原来的任务。
第二种方式的方法和第一种很类似,只是多了一个纳秒级的时间参数。
本文是从 《Java 7 Concurrency Cookbook》 (D瓜哥窃译为 《Java7并发示例集》 )翻译而来,仅作为学习资料使用。没有授权,不得用于任何商业行为。
本节所用示例代码的完整版。
DataSourcesLoader类的完整代码
package com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.D
import java.util.concurrent.TimeU
&* Time: 09:15
public class DataSourcesLoader implements Runnable {
&&& @Override
&&& public void run() {
&&&&&&& System.out.printf("Beginning data sources loading: %s\n",
&&&&&&&&&&&&&&& new Date());
&&&&&&& try {
&&&&&&&&&&& TimeUnit.SECONDS.sleep(4);
&&&&&&& } catch (InterruptedException e) {
&&&&&&&&&&& e.printStackTrace();
&&&&&&& System.out.printf("Data sources loading has finished: %s\n",
&&&&&&&&&&&&&&& new Date());
NetworkConnectionsLoader类的完整代码
package com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.D
import java.util.concurrent.TimeU
&* Time: 09:21
public class NetworkConnectionsLoader implements Runnable {
&&& @Override
&&& public void run() {
&&&&&&& System.out.printf("Beginning data sources loading: %s\n",
&&&&&&&&&&&&&&& new Date());
&&&&&&& try {
&&&&&&&&&&& TimeUnit.SECONDS.sleep(6);
&&&&&&& } catch (InterruptedException e) {
&&&&&&&&&&& e.printStackTrace();
&&&&&&& System.out.printf("Data sources loading has finished: %s\n",
&&&&&&&&&&&&&&& new Date());
Main类的完整代码
package com.diguage.books.concurrencycookbook.chapter1.recipe6;
import java.util.D
&* Time: 09:25
public class Main {
&&& public static void main(String[] args) {
&&&&&&& DataSourcesLoader dsLoader = new DataSourcesLoader();
&&&&&&& Thread thread1 = new Thread(dsLoader, "DataSourcesLoader");
&&&&&&& NetworkConnectionsLoader ncLoader = new NetworkConnectionsLoader();
&&&&&&& Thread thread2 = new Thread(ncLoader, "NetworkConnectionsLoader");
&&&&&&& thread1.start();
&&&&&&& thread2.start();
&&&&&&& try {
&&&&&&&&&&& thread1.join();
&&&&&&&&&&& thread2.join();
&&&&&&& } catch (InterruptedException e) {
&&&&&&&&&&& e.printStackTrace();
&&&&&&& System.out.printf("Main: Configuration has been loaded: %s\n",
&&&&&&&&&&&&&&& new Date());
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910}

我要回帖

更多关于 vc等待线程结束 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信