使用多线程容易碰到这样的问题,主线程需要等待各个任务线程完成后再继续(如释放资源等)。
常见的方法是在线程中使用计数器记录完成的线程数量,并且需要另外的一个线程轮询判断是否已经全部完成。
方案一:
final AtomicInteger counter = new AtomicInteger();
public void testRun() {
final int threadNum = 10;
// 开启任务线程
for (int i = 0; i < threadNum; i++) {
new Thread(new WorkRunnable()).start();
}
// 开启一个监听线程等待所有工作线程运行完毕
new Thread(new Runnable() {
public void run() {
while (true) {
if (counter.get() == threadNum) {
log.info("all threads finish");
break;
}
else {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
class WorkRunnable implements Runnable {
public void run() {
Random random = new Random();
int interval = random.nextInt(10 * 1000);
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info(Thread.currentThread().getName() + " finish");
counter.incrementAndGet();
}
}
代码比较繁琐,监听线程等待100毫秒不会占用过多CPU资源。
另外可以使用线程池来解决,运用JDK1.5的线程池新特性。
方案二:
public void testRun() {
int threadNum = 10;
ExecutorService executor = Executors.newFixedThreadPool(threadNum);
// 开启任务线程
for (int i = 0; i < threadNum; i++) {
executor.execute(new WorkRunnable());
}
// 阻塞直到全部完成后关闭
while(!executor.isTerminated()) {
executor.shutdown();
}
log.info("all threads finish");
}
class WorkRunnable implements Runnable {
public void run() {
Random random = new Random();
int interval = random.nextInt(10 * 1000);
try {
Thread.sleep(interval);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info(Thread.currentThread().getName() + " finish");
}
}
代码非常简洁,但是CPU占用很厉害
分享到:
相关推荐
当一个程序包含多个执行路径,即线程,有时我们需要确保某个线程执行完毕后再进行下一步操作,这就涉及到“等待线程结束”的功能。本篇文章将详细探讨如何在C++中实现这一功能。 首先,C++11引入了对线程支持的标准...
在标题“WinForm C#多线程等待窗体”中,我们探讨的关键点是如何在进行耗时操作时创建一个等待窗体,让用户知道程序正在执行任务,并且不允许用户进行其他操作,直到任务完成。描述提到了“非托管资源”和...
在编程领域,多线程是实现并发执行任务的重要机制,特别是在资源管理、高效能计算以及用户界面响应等方面具有广泛的应用。易语言作为一款中文编程工具,提供了方便的多线程支持,使得开发者能够轻松地创建并管理多个...
在这个“易语言多线程执行任务例程”中,我们将深入探讨如何在易语言中利用多线程技术来提升程序的运行效率和并发能力。 多线程是现代计算机编程中的一个重要概念,它允许一个程序同时执行多个任务,从而充分利用...
本话题主要探讨两种实现WinForm多线程等待窗体的方法:委托加事件以及设定等待时间后自动关闭。 首先,我们来看第一种方法——**委托加事件实现**。这种方法的核心是利用多线程来执行后台任务,同时通过委托和事件...
相比于单线程,多线程能充分利用多核处理器资源,减少程序等待I/O操作时的CPU空闲时间,提升整体性能。此外,多线程还能提高用户体验,例如,一个线程处理用户界面更新,另一线程则负责后台数据计算,避免了用户界面...
// 启动事件循环,等待任务完成 workerThread.eventLoop()->exec(); // 工作线程事件循环结束后,任务完成 workerThread.quit(); workerThread.wait(); ``` 在上述代码中,我们创建了一个新的线程`workerThread`,...
然而,多线程编程中经常需要控制线程的执行顺序,确保某些线程完成特定任务后再继续其他线程的工作,这就是线程等待的作用。 API线程等待,通常涉及到Windows API中的线程同步函数,如`WaitForSingleObject`和`...
在IT领域,多线程并发执行任务是一种常见的优化策略,特别是在服务器端开发、实时系统以及高性能计算中。本文将深入探讨多线程并发执行任务的相关知识点,并基于提供的`MyThread.java`文件,来分析和理解如何在Java...
// 等待子线程结束 WaitForSingleObject(hThread, INFINITE); // 关闭线程句柄 CloseHandle(hThread); return 0; } // 线程函数 DWORD WINAPI ThreadFunction(LPVOID lpParam) { // 子线程执行任务 std::...
- **join()与detach()**: join()用于等待线程结束,detach()使线程成为独立线程,不再需要调用join()。未被join()的线程在主线程结束时会被终止。 3. **Python的多线程** - **threading模块**: Python的threading...
通过以上知识点,你可以理解并实现易语言中的多线程管理,特别是判断多个线程运行结束的功能。实际编程时,应根据具体需求调整代码结构和逻辑,确保程序的稳定性和效率。同时,学习并掌握易语言的文档和在线资源,将...
总之,正确地等待线程结束是多线程编程中不可或缺的一部分。通过理解和应用上述知识点,您可以有效地管理VC++中的线程,确保程序的稳定性和正确性。这个资源提供的代码实例应该能帮助您更好地理解和实践这一概念。
`std::condition_variable`是一个同步原语,允许线程等待特定条件满足,而`std::atomic`则用于原子操作,保证数据在多线程环境中的一致性。 - 使用`std::condition_variable`,一个线程在完成任务后可以唤醒等待的...
在编程领域,多线程是实现并发执行任务的重要机制,特别是在易语言中,它能有效提升程序的执行效率。易语言是一种中文编程语言,旨在降低编程门槛,让普通用户也能进行程序开发。本文将深入探讨易语言中的多线程以及...
在Java多线程编程中,有时我们需要确保所有子线程执行完毕后再进行后续操作,例如在并发测试、数据聚合或资源清理等场景。本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`...
4. **线程同步**:在多线程环境中,同步是确保数据一致性的重要手段。在等待线程池所有任务完成时,可能会涉及到线程同步,如使用Monitor、Mutex或Semaphore等同步原语。 5. **线程池的优缺点**:线程池的优点包括...
5. 线程生命周期管理:包括启动、等待、停止和销毁线程的方法,确保程序在所有线程结束后能够正常退出。 深入学习这个例子,开发者可以掌握如何在实际项目中应用多线程技术,提升软件性能,同时理解如何利用专门的...
在编程领域,多线程是一种常见且强大的技术,它允许应用程序同时执行多个任务,从而提高程序的效率和响应性。Delphi,作为一个流行的Object Pascal开发环境,提供了丰富的工具和库来支持多线程编程。本篇文章将深入...
在VB6(Visual Basic 6)环境中,多线程是一个重要的技术,它允许程序同时执行多个任务,提高程序的响应性和效率。VB6本身并不直接支持多线程,但可以通过调用Windows API来实现。本篇文章将深入探讨如何在VB6中实现...