如何使“主线程”等待“子线程”执行结束后再继续执行
主线程抛出一个子线程异步处理一些东西,这时主线程要等待子线程运行完成再完成(其实我是为了统计运行时间的)。
这里抛出的子线程可能递归的调用自己,就是再抛一个他的子线程出来,但是到底一共抛多少,事先是不知道的。
应用场景:1)多线程扫描文件夹内的文件,遇到文件夹内有子文件夹,要递归调用扫描线程的,等到全部扫描完成后,返回结果,显示;
2)多线程快速排序,第一次肯定是单线程的,第一次排序完成后,会分两半,这两半多线程排,递归调用了这个排序线程,这两半很有可能,极大有可能再各分两半,也就是会有4个子线程的子线程再排序。
我试过网上的那个 CountDownLatch ,但是他只能实现定义好子线程的数量,但是在以上两种情景下,事先你是不知道会有多少个子线程的!
PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。这个貌似也要在开始的时候设定总线程数:CyclicBarrier(int parties)
这个和countDownLatch就差不多了呢!
你觉得呢 问题补充:niuzai 写道亲,CyclicBarrier可能是你想要的。
PS:在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。我再来看看~~试试看! 问题补充:niuzai 写道亲,CyclicBarrier这个东东是可以动态重置个数的,而countDownLatch是一次性的。只不过大多数例子CyclicBarrier初始化了个数罢了,实质上它是可以动态改变的~ 嗯 我试了下,多线程快排,小数据量还好,顺利执行了,但是数多了后,会建N多线程等待,会outofmemory,呵呵!
不过证明这个方法是可以的! 问题补充:niuzai 写道亲,那你就结合线程池操作,设置线程数目上限。不要每个任务就产生一个线程咯~ 产生新的线程是很耗内存的,线程太多当然就内存溢出咯~嗯 你说的很对!要结合线程池的!

在java中同时起多个线程,然后怎么让多个线程进入等待状态?
class MyThread extends Thread { static Object lock = new Object();public void run() {// TODO Auto-generated method stub}public void toWait() {synchronized(lock){try {lock.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public static void toNotifyAll(){synchronized(lock){lock.notifyAll();}}} //让线程对象在run方法中调用toWait使其等待,调用静态方法toNotifyAll唤醒所有线程

java关于等待线程结束的问题!
简单地可以使用 Thread.join() 方法来等待线程结束,例如这样修改一下:Thread t = new Thread() { // 同原来的 run()};t.start();// 调用这个方法,会挂起当前线程直至线程t结束t.join();join()方法的文档是这么写的: Waits for this thread to die.也可以用wait/notify或mutex等机制来对两个线程进行同步,稍微复杂一点,例如使用 wait/notify:new Thread() { public void run() { // 同原来的代码,加上以下代码用于同步 synchronized (results) { results.notifyAll(); } }}.start();// 通过以下代码挂起当前线程,等待其他线程通知synchronized (results) { results.wait();}以供参考。同 i178269245 所说,等待线程结束势必要挂起当前线程,也就没必要用线程了,也许需要重新考虑一下这种实现方式。
有这种需求用什么线程,线程就是做异步处理的。

如何等待线程结束
首先子线程必须由主线程启动,所以严格意义上的“子线程结束后再执行主线程”是不可能实现,你的意思应该是:主线程创建完子线程后,等待子线程退出,在继续执行。 你的代码基本没有多大问题,只是 Join 方法位置放置不对。thread1.Start(); // 先启动所有子线程thread2.Start();thread3.Start();thread4.Start();thread5.Start();thread1.Join(); // 然后在等待子线程退出thread2.Join();thread3.Join();thread4.Join();thread5.Join();你先前的代码:thread1.Start();// 线程1 启动thread1.Join(); // 等待 线程1 退出,线程1 未退出前,后面代码无法执行thread2.Start();// 以下代码,均同上所述。thread2.Join();thread3.Start();thread3.Join();thread4.Start(); thread4.Join();

如何等待线程结束
等待一个线程的结束 Win32 提供WaitForSingleObject()函数,其第一个参数是一个核心对象(如线程)的 handle。为方便讨论,把等待线程称为线程#1,把被等待线程称为线程#2。调用 WaitForSingleObject()并放置一个“线程句柄”作为参数,将使线程#1开始睡眠,直到线程#2结束。像Sleep()函数一样,WaitForSingleObject()也有一个参数用来指定最长的等待时间。DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMilliseconds);hHandle:等待对象的 handle(代表一个核心对象)。dwMilliseconds:等待的最长时间。时间终了,即使 handle尚未成为激发状态,此函数也要返回。此值可以是0(代表立刻返回),也可以是 INFINITE代表无穷等待。如果函数失败,返回WAIT_FAILED。这时可调用 GetLastError()取得更多信息。此函数的成功有三个因素:1. 等待的目标(核心对象)变成激发状态。返回值为WAIT_OBJECT_0。2. 核心对象变成激发状态之前,等待时间终了。返回值为WAIT_TIMEOUT。3. 如果一个拥有mutex(互斥器)的线程结束前没有释放mutex,则传回 WAIT_ABANDONED。(abandoned:废弃)获得一个线程对象的 handle之后,WaitForSingleObject()要求操作系统让线程 #1 睡眠,直到以下任何一种情况发生:1. 线程#2结束2. dwMilliseconds时间终了。该值系从函数调用后开始计算。由于操作系统持续追踪线程#2,即使线程#2 失事或被强迫结束,WaitForSingleObject()仍然能够正常运作。如果想一直等待某个线程,直到线程退出,可以用如下代码:WaitForSingleObject( hThrd, INFINITE );关于time-out,有一个特别重要的用途,但很少被人注意。设定time-out为0,能够检查handle的状态并立刻返回,没有片刻停留。如果handle已经备妥,那么这个函数会成功并传回 WAIT_OBJECT_0。否则,这个函数立刻返回并传回 WAIT_TIMEOUT。另外可以利用 time-out提供一个动画,表示正在等待某个线程的结束。可以每 500毫秒就time-out一次,更新图示,然后再继续等待。 WaitForSingleObject()可以面对许多种 handles工作,不一定非要是的线程 handle。事实上,Win32中大部分以HANDLE表示的对象都能够作为 WaitForSingleObject()的等待目标。视所拥有的对象不同,操作系统等待的事情也不一样。形式上来说,系统等待着这一对象“被激发”。

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/320182.html。