题目标题

介绍一下多线程怎么获取结果,怎么判断全部线程结束?

参考解析

我们多线程抓取数据或者多线程执行任务时,有时候需要多线程执行完后才能执行其他的任务。这种情况下 我们就需要判断多线程什么时候执行完。
方法一 isTerminated
使用isTerminated来判断所有任务都已完成,会返回true。但是前提是启用shutdown顺序关闭。
shutdown
void shutdown()
启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。
抛出:
SecurityException - 如果安全管理器存在并且关闭,此 ExecutorService 可能操作某些不允许调用者修改的线程(因为它没有保持RuntimePermission(“modifyThread”)),或者安全管理器的 checkAccess 方法拒绝访问。
isTerminated
boolean isTerminated()
如果关闭后所有任务都已完成,则返回 true。注意,除非首先调用 shutdown 或 shutdownNow,否则 isTerminated 永不为 true。
返回:
如果关闭后所有任务都已完成,则返回 true
方法二CountDownLatch
CountDownLatch是一个同步辅助类,用来判断多线程是否执行完成。
它的原理是首先声明一共运行多少个线程任务,然后每完成一个线程任务,计数器就减一,当计数器等于0,说明所有的多线程都运行完成了。
主要方法
public CountDownLatch(int count);
public void countDown();
public void await() throws InterruptedException

构造方法参数指定了计数的次数
countDown方法,当前线程调用此方法,则计数减一
await方法,调用此方法会一直阻塞当前线程,直到计时器的值为0。
使用方法
如果你确定了你开启的线程数。
那么在主程序运行前。
CountDownLatch countdown = new CountDownLatch(10);//这里的10就是你的子线程数。
在每个子线程结束后,调用 countdown.countDown();
在主线程里启动子线程的方法后面添加。
countdown.await();//这里进行同步等待
等所有子线程结束后,执行 countdown.await()后面的代码。

推荐习题

合并K个有序链表 lr 模型是线性模型还是非线性, 为什么? 能推导它的原理吗? 在未排序的数组中找到第k个最大的元素,如果是海量数据该怎么办?要求时间复杂度(nlogn)。 有一个木棍长度为n个单位,上面有若干只蚂蚁。蚂蚁只能沿着它朝左或者朝右走。速度为1个每秒一个单位。如果两只走的方向不同的蚂蚁相遇,则它们都会调头,朝相反方向以同样的速度继续走。给定所有蚂蚁的位置,求最后一只蚂蚁掉下棍子的时间。 数据范围:木棍长度n :正整数 1 <= n <= 10000 每只蚂蚁的位置和走的方向,两个非负整数数组left[], right[] 每个数组长度为[0, n + 1]之间的整数。两个数组长度总和是[1, n + 1]之间的整数,在两个数组里,没有整数重复出现。(位置表示是非负整数[0..n]之间。的同一个位置不会有两只蚂蚁。总体上,至少存在一只蚂蚁。) 例如 输入:n = 4, left = {4,3}, right = {0,1}, 答案是4……自己分析下就好。 ![](https://pupload.chinahadoop.cn/program/20201102/8587d7b20eef5b686539bd2430d3afc7.png) 求三个升序数组a[l],b[m],c[n]中,每个数组出一个数,要求max(|a[i]-b[j]|,|a[i]-c[k]|,|b[j]-c[k]|)最小。 整数的二进制表示中1的个数----输入一个整数,求该整数的二进制表达中有多少个1。 例如输入10,由于其二进制表示为1010,有两个1,因此输出2 判断俩个链表是否相交: 给出俩个单向链表的头指针,比如h1,h2,(1)判断这俩个链表是否相交。(2)求出俩个链表相交的第一个节点. 为了简化问题,我们假设俩个链表均不带环. 把二元查找树转变成排序的双向链表