首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java里面Join(),为什么等待的是主线程,而不是当前线程

但是仔细一想,发现这个明明调用的是子线程的join()方法,按道理应该子线程等待执行才是,为什么反而是主线程等待了呢?...源码中注释说明的是等待这个线程终止,那就是等待调用Join()的线程终止,再继续往下看: /** * Waits at most {@code millis} milliseconds for...注意按照程序的执行顺序,我们这里是主线程调用的Thread的Join方法,所以是判断子线程的存活状态,满足则让子线程执行,主线程等待。...wait 等待方法是让线程进入等待队列,使用方法是 obj.wait(); 这样当前线程就会暂停运行,并且进入obj的等待队列中,称作“线程正在obj上等待”。...可以把子线程t理解为一个普通的obj对象,调用t的wait()方法,实际上就是主线程(main线程)在childThread对象的队列上等待,可以转换为如下写法进一步理解: /** * 主线程 */

78950

使用Disruptor完成线程下并发、等待、先后等操作

Java完成线程间的等待功能: 场景1:一个线程等待其他多个线程完成后,再进行下一步操作(如裁判员计分功能,需要等待所有运动员都跑完后,才去统计分数。裁判员和每个运动员都是一个线程)。...场景2:多个线程等待至某个状态后,再同时执行(模拟并发操作,启动100个线程 ,先启动完的需要等待其他未启动的,然后100个全部启动完毕后,再一起做某个操作)。...以上两个场景都较为常见,Java已经为上面的场景1和2分别提供了CountDownLatch和CyclicBarrier两个实现类来完成,参考另一篇文章:https://blog.csdn.net/tianyaleixiaowu...不可避免的是,都需要使用大量的锁,直接导致性能的急剧下降和多线程死锁等问题发生。那么有没有高性能的无锁的方式来完成这种复杂的需求实现呢? 那就是Disruptor!...Disruptor可以非常简单的完成这种复杂的多线程并发、等待、先后执行等。 至于Disruptor是什么就不说了,直接来看使用: 直接添加依赖包,别的什么都不需要。

1.8K30
您找到你想要的搜索结果了吗?
是的
没有找到

Java多种方法实现等待所有子线程完成后再继续执行

简介 在现实世界中,我们常常需要等待其它任务完成,才能继续执行下一步。Java实现等待线程完成再继续执行的方式很多。我们来一一查看一下。...Thread的join方法 该方法是Thread提供的方法,调用join()时,会阻塞主线程,等该Thread完成才会继续执行,代码如下: private static void threadJoin(...CountDownLatch CountDownLatch是一个很好用的并发工具,初始化时要指定线程数,如10。在子线程调用countDown()时计数减1。直到为0时,await()方法才不会阻塞。...All Tasks... executorService.isTerminated() ExecutorService调用shutdown()方法后,可以通过方法isTerminated()来判断任务是否完成...executeServiceIsTerminated Finished All Tasks... executorService.awaitTermination executorService.awaitTermination方法会等待任务完成

25720

win10 uwp 线程池 为什么需要线程池什么是线程线程池原理应用等待代码完成定时器

所以大神就说,那就不创建线程了。 因为花费总时间划不来,所以大神就想直接创建一个线程,也销毁,一旦用户需要一个新线程去做一些事情,就把这个线程给他。...应用 大家从原理可以知道,线程池运行代码,不是立刻运行的,假如线程池有10个线程,刚好都在做其他事情,这时请线程池运行新的代码,就会等待线程池存在空闲线程。...等待代码完成 很多时候的线程模型就是需要运行很多并行代码,在运行完成再运行串行的代码。 ?...这时就需要使用线程池运行代码,还需要等待代码运行完成 例如我需要下载 lindexi.github.io 所有博客,获得所有文章只能使用一个线程获取,但是下载所有博客就可以并行。...在所有下载完成还需要告诉用户,这时只能使用一个线程

1.2K10

开源异步并行框架,完成任意的多线程编排、阻塞、等待、串并行结合、强弱依赖

本文首发于京东零售公众号,https://mp.weixin.qq.com/s/17OAAbCKQND-AjTdf43TGw netty是一个经典的网络框架,提供了基于NIO、AIO的方式来完成少量线程支持海量用户请求连接的模型...Executors.newCachedThreadPool(); Future future = executor.submit(new Task()); //这一步get会阻塞当前线程...据此,我们拆分出几个角色,master主线程,调度器(发起异步调用),worker(异步工作线程)。然后就是将他们组合起来,完成各种异步回调,以及每个worker的正常、异常、超时等的回调。...还好,CompleteableFuture提供了allOf这个方法,它可以让你传入多个future,并且能够等待这多个future都完成时再统一返回。见下图代码。...目前,基于线程池和CompletableFuture已经完成了这样的一个并发框架,由于代码较多,不便于贴在文章内,有需要的,或者有其他需求该并发框架不能满足的,可以联系 wuweifeng10@jd.com

1.6K10

java高并发系列 - 第16天:JUC中等待线程完成的工具类CountDownLatch,必备技能

上面的关键技术点是线程的 join()方法,此方法会让当前线程等待被调用的线程完成之后才能继续。...public void await() throws InterruptedException:调用await()会让当前线程等待,直到计数器为0的时候,方法才会返回,此方法会响应线程中断操作。...public void countDown():让计数器减1 CountDownLatch使用步骤: 创建CountDownLatch对象 调用其实例方法 await(),让当前线程等待 调用 countDown...示例2:等待指定的时间 还是上面的示例,2个线程解析2个sheet,主线程等待2个sheet解析完成。主线程说,我等待2秒,你们还是无法处理完成,就不等待了,直接返回。...TaskDisposeUtils是一个并行处理的工具类,可以传入n个任务内部使用线程池进行处理,等待所有任务都处理完成之后,方法才会返回。

68030

java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)

除了这个方法,还可以借助FutureTask,达到类似的效果,其get方法会阻塞线程,等到该异步处理完成。...for (int i = 0; i < tasks.length; i++) { System.out.println(tasks[i].get());//依次等待所有...... thread 5 done,正在等候其它线程完成... thread 0 done,正在等候其它线程完成... thread 6 done,正在等候其它线程完成... thread 4 done...,正在等候其它线程完成... thread 2 done,正在等候其它线程完成... thread 3 done,正在等候其它线程完成... thread 8 done,正在等候其它线程完成... thread...7 done,正在等候其它线程完成... thread 1 done,正在等候其它线程完成... ----------- 所有thread执行完成

3.3K30

Java学习笔记 调用外部程序

因为在我们获取程序输出的时候,很有可能当前进程并没有结束。那么获取结果就是不合法的操作。因此,为了安全的等待进程结束,我们需要调用waitFor()方法,阻塞当前线程,直到进程退出为止。...ProcessBuilder pb = new ProcessBuilder("java","-version"); Process process = pb.start(); process.waitFor...process.getInputStream().available()]; process.getInputStream().read(bytes); System.out.println(new String(bytes)); 结果会显示当前安装的...由于我们调用了process.waitFor(),所以当记事本窗口关闭前,Java程序也不会关闭。同理,calc可以启动计算器,explorer可以启动资源管理器。...process.getInputStream().available()]; process.getInputStream().read(bytes); System.out.println(new String(bytes)); 查看当前

1.8K70

JAVA001-java  调用bash shell脚本阻塞问题的解决

背景 使用java实现的web端,web端相应用户的界面操作,使用java调用bash实现的shell脚本进行实际的操作,操作完成返回执行结果给web 界面显示。 现象: Java 进程阻塞。...img](file:///D:\Users\Frank\AppData\Local\Temp\ksohtml\wps52C1.tmp.jpg) 分析 Shell子进程的状态是S 睡眠状态,也就是该进程在等待某个条件满足...假设这个子进程一直向标准输出或者标准出错中写数据而jvm一致不读取,若相应的标准出错标准输出缓存区被写满,则该子进程会一直等待缓存区有空间方继续执行。则子进程进入睡眠模式。...我们的java 程序也就阻塞在了 process.waitFor(); 解决办法 所调用的程序中不要有太多的输出到标准出错 、标准输出中。....getInputStream()); LineNumberReader input = new LineNumberReader(ir); String line; process.waitFor

1.3K20

什么是线程和进程?是如何创建、同步、通信、销毁的?

wait 方法可以使当前线程进入等待状态,直到其他线程调用 notify 或者 notifyAll 方法来唤醒这个线程。...notify 方法可以随机唤醒一个正在等待线程,而 notifyAll 方法可以唤醒所有正在等待线程。...在 take 方法中,如果队列中没有消息,则会进入等待状态,并通过 wait 方法释放互斥锁。在 put 方法中,如果队列中有新的消息,则会通知正在等待线程等待状态中唤醒。...在 getCount 方法中,如果计数器的值为零,则会进入等待状态,等待其他线程调用 increment 方法来唤醒这个线程。...在 take 方法中,如果队列中没有消息,则会进入等待状态,并通过 wait 方法释放互斥锁。在 put 方法中,如果队列中有新的消息,则会通知正在等待线程等待状态中唤醒。

41400
领券