引用
最近在测试使用多线程从数据库中读数据,所有子线程结束后,再讲汇总的数据保存到文件中。发现了一个问题,总是会出现这样一种情况:主线程结束后,子线程中的代码还没有执行结束就不再执行了,只执行了其中的一部分。
找了各种资料,都在说主线程结束后,如果子线程不是守护线程,子线程将不会受到影响,继续执行。我这里的线程明明不是守护线程,所以还是很奇怪。
最终终于找出原因了,原来是因为junit单元测试的原因,如果把这段代码放到main方法中执行,每次都是好的。
我还学到了CyclicBarrier这个类的使用方法和场景,这个类在多线程时还是非常有用的。比如:
起10个线程分别取从数据库中以分页的方式去查数据,当10个线程都执行结束后,将总的查询数据写入的数据库中。这个时候如何保证所有线程都执行结束的这个时间点,就可以使用CyclicBarrier。
CyclicBarrier:同步辅助类。一组线程相互等待,全部执行结束后,会唤醒CyclicBarrier指定的同步线程,执行最终的统计工作。
public class CountThread extends Thread {
public CountThread(int count, CyclicBarrier cyclicBarrier) {
this.count = count;
this.cyclicBarrier = cyclicBarrier;
}
private int count;
private CyclicBarrier cyclicBarrier;
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println(count);
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
public class SumTaskThread implements Runnable {
@Override
public void run() {
System.out.println("****************汇总*******************");
}
}
public static void main(String[] args) {
test1();
}
public static void test1() {
// 同步辅助类,当所有的10个子线程都指向结束后会指向SumTaskThread线程
CyclicBarrier cyclicBarrier = new CyclicBarrier(10, new SumTaskThread());
for (int i = 1; i <= 10; i++) {
new CountThread(i, cyclicBarrier).start();
}
System.out.println("主线程执行结束");
}
分享到:
相关推荐
Handler消息传递详解,子线程到子线程,主线程到子线程,子线程到主线程 三种消息,Looper,Handler工作机制详解 https://blog.csdn.net/shoneworn/article/details/80447651
对于多线程而言,一个主要的难题就是如何线程是否都已经执行结束。 也就是说,需要在主线程开启子多线程后,直到子线程全部执行结束为止,回到主线程。
JAVA主线程等待子线程执行完毕再执行[参照].pdf
我在工作的过程中遇到一个问题,需要主线程等等所有子线程执行完后再做某件事情,在网上找了很多代码,都没有真正解决这个问题. 现在我解决了这个问题,把代码共享出来供大家参考. 代码中有注释和注意事项,相信大家看过...
python 零基础学习篇
NULL 博文链接:https://zhaoningbo.iteye.com/blog/1158225
下面小编就为大家带来一篇C#子线程执行完后通知主线程的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
非常实用不解释,用了才知道 个人收藏的一部分资料将陆续给大家上传
C#子线程刷新主线程示例源码 功能介绍: 使用线程操作 1、实时显示当前时间 2、输入加数和被加数,自动出现... 使用了多线程实现了子线程刷新主线程 ,使用委托刷新主线程。 注意: 开发环境为Visual Studio 2012
Unity异步线程调用主线程脚本程序,在Unity中异步线程调用主线程会报错,所以编写了一个Loom
Qt主线程与次线程通信实例代码,方便大家学习下载使用! Qt主线程与次线程通信实例代码,方便大家学习下载使用! Qt主线程与次线程通信实例代码,方便大家学习下载使用!
程序:安装在移动设备上的每一个应用,都是一个程序 进程:正在运行的每一个应用程序,都是一个进程;相当于一个任务; 线程:执行任务时的一个单独的代码块(单独的功能)称作线程
C# Winfrom必须掌握的技术,主线程显示数据,子线程获取数据,这是我做项目实际用到的技术。
python爬虫-08-主线程会等待子线程执行结束再结束.ev4.rar
自己学着编写的一个JAVA多线程程序,该程序实现的功能是:在主线程main中创建两个子线程,A和B,线程A先运行,再运行B线程,当两个子线程都运行完毕后,才运行主线程,并最终结束整个程序的运行。 希望该程序对初学...
主线程和子线程的区别 每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。 线程唯一标示符:Thread.CurrentThread.ManagedThreadID; UI界面和Main函数均为主线程。 被Thread包含的“方法体”或者“委托...
这篇文章主要介绍了python主线程与子线程的结束顺序实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 引用自 主线程退出对子线程的影响 的一段话: 对于...
Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码 22 如何从子线程更新主线程数据Visual C++源代码...
我就废话不多说了,还是直接看代码吧! from time import ctime import threading import time def a(): #for i in range(5): print('Program a is running... at ', ctime(),u'.线程名为:',threading.current...