就绪状态指的是JVM完成了方法调用栈和程序计数器的创建,等待该线程的调度和运行。...阻塞状态:Blocked 运行中的线程会主动或被动地放弃 CPU 的使用权并暂停运行,此时该线程将转为阻塞状态,直到再次进入可运行状态,才有机会再次竞争到CPU使用权并转为运行状态。...(3)其他阻塞:运行状态的线程在执行Thread.sleep(long ms)、Thread.join()或者发出I/O请求时,JVM会把该线程转为阻塞状态。...直到sleep()状态超时、Thread.join()等待线程终止或超时,或者I/O处理完毕,线程才重新转为可运行状态。...线程终止:Terminated 线程在以如下三种方式结束后转为终止状态。 ◎ 线程正常结束:run方法或call方法执行完成。
本文首发于京东零售公众号,https://mp.weixin.qq.com/s/17OAAbCKQND-AjTdf43TGw netty是一个经典的网络框架,提供了基于NIO、AIO的方式来完成少量线程支持海量用户请求连接的模型...首先我们来拆分一下需求,我有N个耗时任务,可能是一次网络请求,可能是一个耗时文件IO,可能是一堆复杂的逻辑,我在主线程里发起这个任务的调用,但不希望它阻塞主线程,而期望它执行完毕(成功\失败)后,来发起一次回调...据此,我们拆分出几个角色,master主线程,调度器(发起异步调用),worker(异步工作线程)。然后就是将他们组合起来,完成各种异步回调,以及每个worker的正常、异常、超时等的回调。...} return object + " world"; } }; } } 执行结果如下: 可以看到主线程没有被耗时的线程阻塞掉...目前,基于线程池和CompletableFuture已经完成了这样的一个并发框架,由于代码较多,不便于贴在文章内,有需要的,或者有其他需求该并发框架不能满足的,可以联系 wuweifeng10@jd.com
这时,我们可以使用线程的join()方法来实现主线程等待子线程运行完成再执行,这个在面试中,如果问到线程相关的知识,这个也是必问,本文就来讲解Thread的join方法,如何让主线程等待子线程运行完在执行...一、join()方法的使用join()方法是一个线程类的方法,用于等待当前线程终止。当调用join()方法时,当前线程将被挂起,直到被等待的线程终止。...如果子线程在超时时间内没有完成执行,主线程将继续执行。thread.join(100);thread.join(1000,10);二、join()案例代码上面介绍,join的用法,接来直接用代码演示。...); } catch (InterruptedException e) { e.printStackTrace(); }}thread.wait()表示对当前方法(main)线程进行阻塞...(block),导致主线程会等待thread线程唤醒通过jps命令查看java运行线程,jstack 线程id,可以看到主线程main的状态是WAITING总结本文介绍了如何实现主线程等待子线程运行完成再执行的方法
Java线程一共分为6种状态,分别为: 新建状态(NEW) 就绪状态(RUNNABLE) 阻塞状态(BLOCKED) 等待状态(WAITING) 限时等待状态(TIMED_WAITING) 结束状态(TERMINATED...A thread that has called Thread.join() * is waiting for a specified thread to terminate...BLOCKED状态 如果线程在执行过程中遇到了synchronized或者Lock,那么就会进入到阻塞状态。...处于阻塞状态的线程会放弃对CPU的使用权,停止执行,直到次线程进入到了就绪的状态,才会有机会再次被CPU调用运行。...WAITING状态 如果线程被调用了没有超时时间的wait方法,那么会进入无限等待状态。直到被notify通知才可以继续执行。
要实现这个需求,我们就要思考一下看有没有一种机制能让主线程等待其他子线程完成任务后,它再继续执行它余下的业务逻辑? 方案实现 ★方案一:Thread.join() 什么是join?...基本语义: 如果一个线程A调用了thread.join()方法,那么当前线程A需要等待thread线程完成任务后,才能从thread.join()阻塞处返回。.../阻塞当前线程,直到计数器的值为0 System.out.println("阻塞完毕!...子线程pool-1-thread-2执行完成 子线程pool-1-thread-1执行完成 子线程pool-1-thread-3执行完成 阻塞完毕!主线程main继续执行业务逻辑......它的意思是让一组线程到达一个栅栏时被阻塞,直到最后一个耗时较长的线程完成任务后也到达栅栏时,栅栏才会打开,此时所有被栅栏拦截的线程才会继续执行。
BLOCKED - 阻塞状态,等待锁,以便进入同步块儿。 TERMINATED - 终止状态,线程执行结束。...(2)非正常情况 线程执行的时候遇到了点问题,需要等待(WAITING、TIMED WAITING)一会儿,或者被别人阻塞了(BLOCKED)。 线程结束等待之后,也可能进入阻塞状态。...非正常情况结束之后,线程再继续执行自己的工作,所以箭头也好理解了。 NEW NEW 线程是被创建出来后还没执行的。 这个状态直到调用了 start() 方法后变化。...调用下列方法后就会进入 WAITING 状态: object.wait() thread.join() LockSupport.park() 例如: 我们创建并启动 1个线程 threadA threadA...TERMINATED 这是线程生命结束的状态,一个线程的结束,可能是正常执行完成了,也可能是异常终止了。
java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用户下单成功...我们通过以下的几种方法来解决: 一、使用Thread的join()等待所有的子线程执行完毕,主线程在执行,thread.join()把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程...比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。...latch.await();//阻塞当前线程直到latch中数值为零才执行 System.out.println("主线程执行!")...barrier.await();//阻塞当前线程直到latch中数值为零才执行 System.out.println("主线程执行!")
如没有设置timeout的Object.wait()方法和Thread.join()方法,以及LockSupport.park()方法 限时等待(Timed Waiting):该状态下的线程不会被分配CPU...如Thread.sleep(),设置了timeout的Object.wait()和Thread.join(),LockSupport.parkNanos()以及LockSupport.parkUntil...()方法 阻塞(Blocked):线程被阻塞了,与等待的区别是:阻塞线程在等待一个排它锁....阻塞状态是因为某种原因放弃CPU使用权,暂时停止执行,直到线程进入就绪状态,才有机会转到运行状态....,I/O处理完成,该线程重新转入就绪状态.
由于目前大部分操作系统都是使用抢占式调度模型进行线程调度,Java的线程管理和调度是委托给操作系统完成的,与之相对应,Jmatchava的线程调度也是使用抢占式调度模型,因此Java的线程都有优先级...更确切地说,如果线程被Object.wait()、Thread.join()和Thread.sleep()三种方法之一阻塞,此时调用该线程的interrupt()方法,该线程将抛出一个InterruptedException...(timeout)参数的thread.join()调用:在线程合并场景中,若线程A调用B.join()去合入B线程,则在B执行期间线程A处于WAITING状态,一直等线程B执行完成。...它并不像stop方法那样会中断一个正在运行的线程; 如果线程被Object.wait、Thread.join、Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个...如果线程没有被阻塞,这时调用 interrupt()将不起作用,直到执行到wait()、sleep()、join()时,才马上会抛出 InterruptedException; interrupted(
以下方法会让线程陷入无限期的等待状态: 1.没有设置Timeout参数的Object.wait()方法。 2.没有设置Timeout参数的Thread.join()方法。...5.阻塞(BLOCKED):线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”在等待着获取到一个排他锁,这个事件将在另外一个线程获得锁的时候可能发生,比如synchronized之外;而“等待状态...需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。...void parkUntil(long deadline) 阻塞当前线程,直到deadline时间点 void unpark(Thread) 唤醒处于阻塞状态的线程 park不需要获取某个对象的锁...直到对应的线程执行resume()方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。
阻塞(BLOCKED):线程被阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”在等待着获取到一个排他锁,这个事件将在另外一个线程获得锁的时候可能发生,比如synchronized之外;而“等待状态...需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。...,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。...void parkUntil(long deadline)阻塞当前线程,直到deadline时间点void unpark(Thread)唤醒处于阻塞状态的线程 park不需要获取某个对象的锁;因为中断的时候...直到对应的线程执行resume()方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。
上篇介绍了Java垃圾回收机制,一文看懂Java垃圾回收机制, 本文来介绍Java多线程通讯的原理 ? 正常情况下,每个子线程完成各自的任务就可以结束了。...不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。...线程等待 三个运动员各自准备,等到三个人都准备好后,再一起跑 上面是一个形象的比喻,针对 线程 A B C 各自开始准备,直到三者都准备完毕,然后再同时运行 。...这里我们可以学到,通过 FutureTask 和 Callable 可以直接在主线程获得子线程的运算结果,只不过需要阻塞主线程。...当然,如果不希望阻塞主线程,可以考虑利用 ExecutorService,把 FutureTask 放到线程池去管理执行。
正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。...四个线程 A B C D,其中 D 要等到 A B C 全执行完毕后才执行,而且 A B C 是同步运行的 三个运动员各自准备,等到三个人都准备好后,再一起跑 子线程完成某件任务后,把得到的结果回传给主线程...futureTask.get() 方法时阻塞主线程;然后 Callable 内部开始执行,并返回运算结果;此时 futureTask.get() 得到结果,主线程恢复运行。...这里我们可以学到,通过 FutureTask 和 Callable 可以直接在主线程获得子线程的运算结果,只不过需要阻塞主线程。...当然,如果不希望阻塞主线程,可以考虑利用 ExecutorService,把 FutureTask 放到线程池去管理执行。
没有设置TimeOut参数的Thread.join()方法。 LockSupport.park()方法。 Timed waiting 限期等待: 处于这种状态的线程也不会被分配时间片。...但是他无需其他线程唤醒,在一定的时间之后他们会被分配CPU执行的时间 Thread.sleep Object.wait()设置了TimeOut Thread.join()设置了TimeOut LockSupport.parkNanous...() LockSupport.parkUtil() blocked阻塞: 线程被阻塞了,阻塞状态和等待状态的区别在于,阻塞是在等待获取到一个排他锁而等待是在等待另一个线程的唤醒或者等待一段时间。...这种一般会在使用sychronnized的时候会发生 Terminated结束: 已终止线程的线程状态,线程已结束执行。 上面的描述了6种但是其中有两种都是等待所以说是5种状态值。...线程池的状态 在java中线程池的实现的主类是通过ThreadPoolExcutor这个类来实现的, 线程池运行的状态,并不是用户显式设置的,而是伴随着线程池的运行,由内部来维护。
深入浅出CountDownLatch CountDownLatch的基本使用 基本概念和案例 CountDownLatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行...Thread(countDownLatch::countDown).start(); // 1 - 1 // = 0 后才会唤醒 countDownLatch.await(); // 阻塞主线程...、阻塞和唤醒。...= 0) { // s.getAndUnsetStatus(WAITING); // 释放线程取消阻塞状态 LockSupport.unpark...(s.waiter); } } 通过共享锁不断传递、唤醒下一个节点,直到头节点和尾节点相同则说明已经没有需要唤醒的线程了,完成所有线程的唤醒。
BLOCKED:阻塞等待锁的线程状态 表示线程处于阻塞状态,正在等待监视器锁 synchronized代码块或synchronized标记的方法 解决方法:等待执有锁的线程释放锁,并获取到锁后继续执行...() 补充:join事实上还是调用wait,只是经历了一些判断之后 DEAD(TERMINATED): 线程执行完成(等待销毁) 线程是如何工作的 new->start()->run方法中有synchronized...,只是在阻塞等待其他线程使用完某个资源 waitting是因为调用了Object.wait()、Thread.join()、LockSupport.park()方法而进入等待状态,只能等待其他线程执行完某个特定动作才能唤醒...otherThread.join() 线程会让出执行权给otherThread,直到otherThread执行完才唤醒(或者设置了timeout,在timeout到了也会执行) yield() 告诉线程调度器...因为suspend方法并不会释放锁,如果使用suspend的目标线程对一个重要的系统资源持有锁,那么没任何线程可以使用这个资源直到要suspend的目标线程被resumed,如果一个线程在resume目标线程之前尝试持有这个重要的系统资源锁再去
所有的共享变量都存在主内存中 每个线程都保存了一份该线程使用到的共享变量的副本 如果线程A与线程B之间要通信的话,必须经历下面两个步骤 线程A将本地内存A中更新过的共享变量刷新到主内存中 线程B到主内存中去读取线程...JMM通过控制主内存与每个线程的本地内存之间的交互,来提供内存可见性保证。...状态名称 说明 NEW 初始状态,Thread对象被创建,但是还没有调用start()方法 RUNNABLE 运行状态,Java中将运行和就绪态统称为运行态 BLOCKED 阻塞状态,线程获取不到锁资源而进入阻塞状态...纠错:左上角Object.join()应为Thread.join() 创建线程的三种方式 方法一:继承Thread,覆写run()方法 方法二:实现Runnable接口,然后交给Thread执行 例子...new Thread(task, "thread1").start(); // 调用者线程阻塞,直到task任务执行结束返回结果 String result
领取专属 10元无门槛券
手把手带您无忧上云