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

面试必答题“聊聊Java中线程的生命周期状态”如何破?

就绪状态指的是JVM完成了方法调用栈和程序计数器的创建,等待该线程的调度和运行。...阻塞状态:Blocked 运行中的线程会主动或被动地放弃 CPU 的使用权并暂停运行,此时该线程将转为阻塞状态,直到再次进入可运行状态,才有机会再次竞争到CPU使用权并转为运行状态。...(3)其他阻塞:运行状态的线程在执行Thread.sleep(long ms)、Thread.join()或者发出I/O请求时,JVM会把该线程转为阻塞状态。...直到sleep()状态超时、Thread.join()等待线程终止或超时,或者I/O处理完毕,线程才重新转为可运行状态。...线程终止:Terminated 线程在以如下三种方式结束后转为终止状态。 ◎ 线程正常结束:run方法或call方法执行完成

27720

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

本文首发于京东零售公众号,https://mp.weixin.qq.com/s/17OAAbCKQND-AjTdf43TGw netty是一个经典的网络框架,提供了基于NIO、AIO的方式来完成少量线程支持海量用户请求连接的模型...首先我们来拆分一下需求,我有N个耗时任务,可能是一次网络请求,可能是一个耗时文件IO,可能是一堆复杂的逻辑,我在主线程里发起这个任务的调用,但不希望它阻塞线程,而期望它执行完毕(成功\失败)后,来发起一次回调...据此,我们拆分出几个角色,master主线程,调度器(发起异步调用),worker(异步工作线程)。然后就是将他们组合起来,完成各种异步回调,以及每个worker的正常、异常、超时等的回调。...} return object + " world"; } }; } } 执行结果如下: 可以看到主线程没有被耗时的线程阻塞掉...目前,基于线程池和CompletableFuture已经完成了这样的一个并发框架,由于代码较多,不便于贴在文章内,有需要的,或者有其他需求该并发框架不能满足的,可以联系 wuweifeng10@jd.com

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

面试专题:如何实现主线程等待子线程运行完在执行

这时,我们可以使用线程的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总结本文介绍了如何实现主线程等待子线程运行完成再执行的方法

21410

我用这个同步工具类优化了一个人脸识别项目,启动时间从40分钟降到10分钟...

要实现这个需求,我们就要思考一下看有没有一种机制能让主线程等待其他子线程完成任务后,它再继续执行它余下的业务逻辑? 方案实现 ★方案一: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继续执行业务逻辑......它的意思是让一组线程到达一个栅栏时被阻塞直到最后一个耗时较长的线程完成任务后也到达栅栏时,栅栏才会打开,此时所有被栅栏拦截的线程才会继续执行。

23410

图解 Java 线程生命周期

BLOCKED - 阻塞状态,等待锁,以便进入同步块儿。 TERMINATED - 终止状态,线程执行结束。...(2)非正常情况 线程执行的时候遇到了点问题,需要等待(WAITING、TIMED WAITING)一会儿,或者被别人阻塞了(BLOCKED)。 线程结束等待之后,也可能进入阻塞状态。...非正常情况结束之后,线程再继续执行自己的工作,所以箭头也好理解了。 NEW NEW 线程是被创建出来后还没执行的。 这个状态直到调用了 start() 方法后变化。...调用下列方法后就会进入 WAITING 状态: object.wait() thread.join() LockSupport.park() 例如: 我们创建并启动 1个线程 threadA threadA...TERMINATED 这是线程生命结束的状态,一个线程的结束,可能是正常执行完成了,也可能是异常终止了。

3.1K34

java多线程并发控制countDownLatch和cyclicBarrier的使用

java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用户下单成功...我们通过以下的几种方法来解决: 一、使用Thread的join()等待所有的子线程执行完毕,主线程在执行,thread.join()把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程...比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。...latch.await();//阻塞当前线程直到latch中数值为零才执行 System.out.println("主线程执行!")...barrier.await();//阻塞当前线程直到latch中数值为零才执行 System.out.println("主线程执行!")

45720

ThreadStatus(线程的几种状态)

以下方法会让线程陷入无限期的等待状态: 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()方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。

80120

面试系列之-线程其他相关(JAVA基础)

由于目前大部分操作系统都是使用抢占式调度模型进行线程调度,Java的线程管理和调度是委托给操作系统完成的,与之相对应,J‍match‍ava的线程调度也是使用抢占式调度模型,因此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(

10610

Java线程状态(生命周期)以及线程状态转换详解

阻塞(BLOCKED):线程阻塞了,“阻塞状态”与“等待状态”的区别是:“阻塞状态”在等待着获取到一个排他锁,这个事件将在另外一个线程获得锁的时候可能发生,比如synchronized之外;而“等待状态...需要注意的是,jdk规定,join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join()。...,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。...void parkUntil(long deadline)阻塞当前线程直到deadline时间点void unpark(Thread)唤醒处于阻塞状态的线程   park不需要获取某个对象的锁;因为中断的时候...直到对应的线程执行resume()方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行。

56740

Java里如何实现线程间通信?

正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。...四个线程 A B C D,其中 D 要等到 A B C 全执行完毕后才执行,而且 A B C 是同步运行的 三个运动员各自准备,等到三个人都准备好后,再一起跑 子线程完成某件任务后,把得到的结果回传给主线程...futureTask.get() 方法时阻塞线程;然后 Callable 内部开始执行,并返回运算结果;此时 futureTask.get() 得到结果,主线程恢复运行。...这里我们可以学到,通过 FutureTask 和 Callable 可以直接在主线程获得子线程的运算结果,只不过需要阻塞线程。...当然,如果不希望阻塞线程,可以考虑利用 ExecutorService,把 FutureTask 放到线程池去管理执行。

67210

Java 里如何实现线程间通信?

上篇介绍了Java垃圾回收机制,一文看懂Java垃圾回收机制, 本文来介绍Java多线程通讯的原理 ? 正常情况下,每个子线程完成各自的任务就可以结束了。...不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。...线程等待 三个运动员各自准备,等到三个人都准备好后,再一起跑 上面是一个形象的比喻,针对 线程 A B C 各自开始准备,直到三者都准备完毕,然后再同时运行 。...这里我们可以学到,通过 FutureTask 和 Callable 可以直接在主线程获得子线程的运算结果,只不过需要阻塞线程。...当然,如果不希望阻塞线程,可以考虑利用 ExecutorService,把 FutureTask 放到线程池去管理执行。

48020

Java 是如何实现线程间通信的?

正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。...四个线程 A B C D,其中 D 要等到 A B C 全执行完毕后才执行,而且 A B C 是同步运行的 三个运动员各自准备,等到三个人都准备好后,再一起跑 子线程完成某件任务后,把得到的结果回传给主线程...futureTask.get() 方法时阻塞线程;然后 Callable 内部开始执行,并返回运算结果;此时 futureTask.get() 得到结果,主线程恢复运行。...这里我们可以学到,通过 FutureTask 和 Callable 可以直接在主线程获得子线程的运算结果,只不过需要阻塞线程。...当然,如果不希望阻塞线程,可以考虑利用 ExecutorService,把 FutureTask 放到线程池去管理执行。

15920

线程线程池的几个状态值

没有设置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这个类来实现的, 线程池运行的状态,并不是用户显式设置的,而是伴随着线程池的运行,由内部来维护。

77220

Java 是如何实现线程间通信的?

正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。...四个线程 A B C D,其中 D 要等到 A B C 全执行完毕后才执行,而且 A B C 是同步运行的 三个运动员各自准备,等到三个人都准备好后,再一起跑 子线程完成某件任务后,把得到的结果回传给主线程...futureTask.get() 方法时阻塞线程;然后 Callable 内部开始执行,并返回运算结果;此时 futureTask.get() 得到结果,主线程恢复运行。...这里我们可以学到,通过 FutureTask 和 Callable 可以直接在主线程获得子线程的运算结果,只不过需要阻塞线程。...当然,如果不希望阻塞线程,可以考虑利用 ExecutorService,把 FutureTask 放到线程池去管理执行。

22250

面试官:Java 是如何实现线程间通信的?

正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。...四个线程 A B C D,其中 D 要等到 A B C 全执行完毕后才执行,而且 A B C 是同步运行的 三个运动员各自准备,等到三个人都准备好后,再一起跑 子线程完成某件任务后,把得到的结果回传给主线程...futureTask.get() 方法时阻塞线程;然后 Callable 内部开始执行,并返回运算结果;此时 futureTask.get() 得到结果,主线程恢复运行。...这里我们可以学到,通过 FutureTask 和 Callable 可以直接在主线程获得子线程的运算结果,只不过需要阻塞线程。...当然,如果不希望阻塞线程,可以考虑利用 ExecutorService,把 FutureTask 放到线程池去管理执行。

19320

jvm源码解析(三)线程状态

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目标线程之前尝试持有这个重要的系统资源锁再去

61920

线程学习系列二(使用System.Threading)

直到thread.Join()方法阻塞调用线程直到thread实例的线程终止才执行其他的线程,这样就是一直执行完+,最后执行- 二、线程的管理 线程包含了大量的方法和属性,用于它们的执行。...阻塞调用线程,直至此实例表示的线程终止,Join()方法的重载运行获得一个int或者TimeSpan作为参数,意思是指定最多等待Thread执行的时间,过期不候 IsBackGround。...新线程默认为“前台”线程,操作系统将在进程中所有前台线程完成后终止进程。...,等当前异步工作完成。...,而是告诉线程池想要完成什么样的工作,工作结束后线程不是被销毁而是会回到线程池中,这样就节省了创建线程以及销毁线程所需要的开销。

63740
领券