Java主线程等待所有子线程执行完毕再执行解决办法(转)
方法一:
Thread.join()方法,亲测可行,thread.join()方法
- Vector<Thread> ts = new Vector<Thread>();
- for (int i = 0; i < 200; i++) {
- Thread t = new Thread(new Runnable() {
- @Override
- public void run() {
- Counter.inc();
- }
- });
- ts.add(t);
- t.start();
- }
- for (Thread t : ts) {
- try {
- t.join();
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- System.out.println("----------" + Counter.count);
(全部代码见上一篇文章)
这个循环中的join的意思是:子线程排好队,欢迎新同学main线程,main线程对着排好队的他们说,我站你后边,我站你后边,我站你后边。。。。(ts.size()次)。然后站到最后一个的后面了。恩、
方法二:
用线程池。
代码:
- ExecutorService threadPool = Executors.newScheduledThreadPool(10);
- ExecutorService threadPool = Executors.newCachedThreadPool();
- for (int i = 0; i < 200; i++) {
- threadPool.execute(new Runnable() {
- @Override
- public void run() {
- chi.inc();
- }
- });
- }
- threadPool.shutdownNow();
- try {
- threadPool.awaitTermination(3, TimeUnit.MICROSECONDS);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("------" + chi.count);
Executors是个工厂,(工厂模式),创建出几种不同类别的线程池。这里我用ScheduledThreadPool。(因为好使,注释掉的那种不知为什么不管用)。
然后用shutdownNow(),这个方法是马上停止(试图)正在执行的任务,线程池进入STOP状态,不再开启正在等待的线程。
对比的,shutdown()方法是阻止等待中的进程开启,等待所有正在执行的进程完成。
Java主线程等待所有子线程执行完毕再执行解决办法(转)的更多相关文章
- java主线程等待所有子线程执行完毕在执行(常见面试题)
java主线程等待所有子线程执行完毕在执行(常见面试题) java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个 ...
- Java多线程--让主线程等待所有子线程执行完毕
数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis() ...
- Java父线程(或是主线程)等待所有子线程退出
static void testLock1(){ final AtomicInteger waitCount = new AtomicInteger(30000); final Object wait ...
- Java主线程等待子线程、线程池
public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...
- C# 多线程join的用法,等待多个子线程结束后再执行主线程
等待多个子线程结束后再执行主线程 class MultiThread{ #region join test public void MultiThreadTest() { Thread[] ths = ...
- [Java][Android] 多线程同步-主线程等待全部子线程完毕案例
有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话 ...
- java主线程结束和子线程结束之间的关系
(一)Main线程是个非守护线程,不能设置成守护线程. 这是因为,main线程是由java虚拟机在启动的时候创建的.main方法开始执行的时候,主线程已经创建好并在运行了.对于运行中的线程,调用Thr ...
- 线程:Java主线程等待子线程结束
使用Thread.join()方法: public class App { public static void main(String[] args) { testMain(); } public ...
- crontab 实现定时脚本执行完毕再执行下一次
0 4 * * 1 flock -xn /tmp/oneSendTemp.lock -c /home/check_a/h_demand.sh > /dev/null 2>&1
随机推荐
- PLAYGROUND 延时运行
PLAYGROUND 延时运行 由 王巍 (@ONEVCAT) 发布于 2015/09/16 从 WWDC 14 的 Keynote 上 Chris 的演示就能看出 Playground 异常强大,但 ...
- Sass基本数据类型和各类型的原生方法
数据类型: 数字:1,2,3,11,10px (可以带单位) 字符串:"asd",'asd',asd (有引号和无引号都是字符串类型) 如 $name : zhang san ; ...
- git 的.gitignore
# vs code .vscode # Logs *.log #npm node_modules
- GIMP做成颜色蒙板
效果图: 原始的美女图片上盖了一层的颜色,这个是想出来的效果,只是用来实践学到的技能,具体的场景还没有确定. 1/首先打开原始的美女图片: 2/然后在添加一张新的图片,作为新的图层添加进来: 这样的话 ...
- [php] 高级教程
include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码. include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的: require 生成一个 ...
- python模块--random
random主要用于生成随机字符串等,例如登录页面上随机字符串验证. random常用方法: import random print(random.randrange(1, 10)) # 返回1-10 ...
- 关于在一台主机上安装2个不同版本的Oracle服务端
一.安装Oracle12c 按正常安装方法安装即可! ORACLE_BASE=/u01/app ORACLE_HOME=/u01/app/oracle ORACLE_SID=a4orcl 二.安装Or ...
- 大数据学习——Kafka集群部署
1下载安装包 2解压安装包 -0.9.0.1.tgz -0.9.0.1 kafka 3修改配置文件 cp server.properties server.properties.bak # Lice ...
- 学习笔记7——wp版本更新需要注意的问题
平时开发时应该避免修改wp的核心代码, 因为在升级wp版本时,核心代码都会被覆盖, wp升级时只有wp-content文件夹不会被覆盖.
- 【LeetCode】Reorder Log Files(重新排列日志文件)
这道题是LeetCode里的第937道题. 题目描述: 你有一个日志数组 logs.每条日志都是以空格分隔的字串. 对于每条日志,其第一个字为字母数字标识符.然后,要么: 标识符后面的每个字将仅由小写 ...