首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

本文深入探讨虚拟机运行时的java线程启动、停止、睡眠与中断

JavaThread持有一个指向java.lang.Thread对象的指针,即oop(JavaThread::_threadObj),java.lang.Thread持有一个指向JavaThread的指针...JavaThread,再由JavaThread创建操作系统线程,然后用JavaCalls进入Java层,新线程执行Runnable.run代码。...因为当ThreadDeath异常传播到上层栈帧时,上层栈帧中的monitor将会被解锁,如果受这些monitor保护的对象正处于不一致状态(如对象正在初始化中),其他线程会看到对象的不一致状态。...睡眠与中断 Thread.sleep()可以一个线程进入睡眠状态,它在底层调用JVM_Sleep方法,如代码清单4-10所示: 代码清单4-10 线程睡眠 JVM_ENTRY(void, JVM_Sleep...(old_state); } JVM_END Thread.sleep()首先确保线程睡眠时间大于等于零。

42120

Java多线程详解1

一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。 Java中,每个线程都有一个调用栈,即使不在程序中创建任何新的线程,线程在后台运行着。...当start()方法调用时,线程首先进入可运行状态。在线程运行之后或者从阻塞、等待或睡眠状态回来后,返回到可运行状态。...3、运行状态:线程调度程序从可运行池中选择一个线程作为当前线程时线程所处的状态。这也是线程进入运行状态的唯一一种方式。 4、等待/阻塞/睡眠状态:这是线程有资格运行时它所处的状态。...当线程睡眠时,它入睡在某个地方,在苏醒之前不会返回到可运行状态。当睡眠时间到期,则返回到可运行状态。 线程睡眠的原因:线程执行太快,或者需要强制进入下一轮,因为Java规范不保证合理的轮换。...(); } 睡眠的位置:为了其他线程有机会执行,可以将Thread.sleep()的调用放线程run()之内。

93090

深入浅出解析JVM中的Safepoint | 得物技术

相信大部分人一样,都是通过这样的方式第一次对安全点有了初步认识。不妨,先复习一下《深入理解Java虚拟机》书中安全点那一章节的内容。...,经常人摸不着头脑。...执行结果如下方动图展示: 图片 图片 从执行结果看,主线程在启动两个线程后进入睡眠状态,代码中指定睡眠时间为1s,但是主线程却在3s多之后才睡眠结束。...(2)主线程是在哪里进入的安全点 从示例代码在默认JVM参数执行结果看,主线程睡眠时间超过了3s,事实上主线程是在Thread.sleep()方法内部进入安全点。...上面截图的注释说在程序进入 Safepoint 的时候,Java 线程可能正处于的五种不同的状态,针对不同的状态的不同处理机制。

29610

线程的常用方法

线程的常用方法 方法名 static 功能描述 注意 start() 启动一个新线 程,在新的线程 运行 run 方法 中的代码 start 方法只是线程进入就绪,里面代码不一定立刻 运行(CPU...new 一个Thread,线程进入了新建状态,调用start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到 时间片 后就可以开始运行了。...2 sleep 调用 sleep 会当前线程从 Running 进入 Timed Waiting 状态(阻塞) 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出...会当前线程从 Running 进入 Runnable 就绪状态,然后调度执行其它线程 具体的实现依赖于操作系统的任务调度器 4 join 使其他线程等待,调用join方法的线程执行完成。...t1.join(3000); 可以看到,t1线程会睡眠2000ms,而其他线程会等待起3000ms。当我们t1线程执行完成后。其他线程不会继续等待3000。会立即往下执行。

17610

Java入门(17)-- 多线程

调用start()方法启动线程 package core; import java.awt.Container; import java.net.URL; import javax.swing.*; public...一旦线程进入可执行状态,它会在就绪与运行状态下转换,同时可能进入等待、休眠、阻塞或死亡状态。...当处于运行状态下的线程调用Thread类中的wait()方法时,该线程便进入等待状态进入等待状态的线程必须调用Thread类中的notify()方法才能被唤醒,而notifyAll()方法是将所有处于等待状态下的线程唤醒...如果一个线程在运行状态下发出输入/输出请求,该线程将进入阻塞状态,在其等待输入/输出结束时线程进入就绪状态,对于阻塞的线程来说,即使系统资源空闲,线程依然不能回到运行状态。...yield()方法使具有同样优先级的线程有进入可执行状态的机会,当当前线程放弃执行权时会再度回到就绪状态

50920

Java学习笔记(线程的几种状态

线程状态概述 线程由生到死的完整过程: 当线程被创建并启动以后,它既不是一启动就进入了执行状态不是一直处于执行状态。在线程的生命周期中,有几种状态呢?...Runnable(可运行) 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,可能没有,这取决于操作系统处理器。...睡眠sleep方法 状态中有一个状态叫做计时等待,可以通过Thread类的方法来进行演示。...public static void sleep(long time) 当前线程进入睡眠状态,到毫秒后自动醒来继续执行 //主线程执行到sleep方法会休眠1秒后再继续执行 public class...); System.out.println(i) } } } 等待和唤醒 public void wait() : 当前线程进入到等待状态 此方法必须锁对象调用。

19230

java多线程之六种状态

一、java线程的六种状态 其中,RUNNABLE状态包括 【运行中】 和 【就绪】; BLOCKED(阻塞态)状态只有在【等待进入synchronized方法(块)】和 【其他Thread调用notify...的方法,只放弃cpu,但是不放弃锁 1、Thread.sleep(long millis),一定是当前线程调用此方法,当前线程进入TIMED_WAITING状态,但不释放对象锁,millis后线程自动苏醒进入就绪状态...2、Thread.yield(),一定是当前线程调用此方法,当前线程放弃获取的CPU时间片,但不释放锁资源,由运行状态变为就绪状态OS再次选择线程。...线程t执行完毕或者millis时间到,当前线程进入就绪状态。...wait()是Object的方法,放弃cpu,放弃锁 4、obj.wait(),当前线程调用对象的wait()方法,当前线程释放对象锁,进入等待队列。

23320

线程的几种状态你真的了解么

线程状态介绍 这里我们讲的是Java中的线程状态。...线程进入等待状态,即线程因为某种原因放弃了CPU使用权,阻塞分为几种情况: 等待阻塞:运行的线程执行wait方法,JVM会把当前线程放入到等待队列 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被其他线程锁占用了...如果我们将线程t1中的睡眠时间修改一下 Thread.sleep(10000L); -> Thread.sleep(3000L); 再来看看运行结果 new t1 t1 的状态:NEW t1 running....start(); t2.start(); 线程t1执行睡眠10s,此时进入线程t2,并执行t2中执行t1.join(5000L)。...接下来t1会抢占5s,进入主线程,主线程睡眠1s,此时t2还在等待t1,所以t2的线程状态为【TIMED_WAITING】。

30430

控制线程

线程状态转换 线程控制基本方法 方法 功能 isAlive() 判断线程是否终止 getpriority() 获得线程的优先级数值 setpriority() 设置线程优先级数值 Thread.sleep...() 设置当前线程睡眠指定毫秒数 join() 调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的运行 yield() 让出CPU,当前线程进入就绪队列等待调度 wait...() 当期线程进入对象的wait pool notify()/notifyAll() 唤醒对象的wait pool中的一个/所有等待线程 sleep/join/yield方法 sleep方法(暂停执行线程...) import java.io.*; import java.util.*; public class TestThread1 { public static void main(String...MyThread线程,因为Mythread线程被打断,sleep方法就会捕捉到异常,执行return,终止程序  这种终止线程的方式并不推荐,Thread类中的stop方法也是停止线程,但是不推荐

32450

Java多线程

等待/阻塞/睡眠 :在一个线程执行了sleep(睡眠)、suspend(挂起)等方法后会失去所占有的资源,从而进入阻塞状态,在睡眠结束后可重新进入就绪状态。...因为使用sleep()方法之后,线程是进入阻塞状态的,只有当睡眠的时间结束,才会重新进入到就绪状态,而就绪状态进入到运行状态,是由系统控制的,我们不可能精准的去干涉它,所以如果调用Thread.sleep...6.2 线程让步(yield) 该方法和sleep()方法类似,也是Thread类提供的一个静态方法,可以正在执行的线程暂停,但是不会进入阻塞状态,而是直接进入就绪状态。...相当于只是将当前线程暂停一下,然后重新进入就绪的线程池中,线程调度器重新调度一次。会出现某个线程调用yield方法后暂停,但之后调度器又将其调度出来重新进入到运行状态。...sleep方法暂停当前线程后,会进入阻塞状态,只有当睡眠时间到了,才会转入就绪状态。而yield方法调用后 ,是直接进入就绪状态

6210

多线程(一):创建线程和线程的常用方法

启动一个新线程 public synchronized void start(); // 线程的方法体,和启动线程没毛关系 public void run(); // 线程睡眠一会...,程序暂停运行,睡眠期间会让出CPU的执行权,去执行其它线程,同时CPU会监视睡眠的时间,一旦睡眠时间到就会立刻执行(因为睡眠过程中仍然保留着锁,有锁只要睡眠时间到就能立刻执行)。...sleep(): 睡眠指定时间,即程序暂停指定时间运行,时间到了会继续执行代码,如果时间未到就要醒需要使用interrupt()来随时唤醒 interrupt(): 唤醒正在睡眠的程序,调用interrupt...,相当于当前,线程进入当前实例的等待队列,这个队列属于该实例对象,所以调用notify必须使用该对象来调用,不能使用别的对象来调用。...6. yield() 交出CPU的执行时间,不会释放锁,线程进入就绪状态,等待重新获取CPU执行时间,yield就像一个好人似的,当CPU轮到它了,它却说我先不急,先给其他线程执行吧, 此方法很少被使用到

92430

Java之线程,常用方法,线程同步,死锁

Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start...,即进入到运行状态。...注:就     绪状态进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中; 阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行...,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。...),它会进入同步阻塞状态; 3.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态

1.1K90

一文搞懂Java的线程生命周期

摘要 Java的多线程机制为开发者提供了充分利用多核处理器的能力,但同时带来了线程安全和同步等问题。了解Java线程的生命周期对于正确管理和调试多线程程序至关重要。 1....引言 在当今高并发的计算环境中,多线程编程成为Java开发中的常见需求。Java提供了丰富的多线程支持,但同时带来了线程安全和同步问题。...然后,我们调用start()方法启动线程,输出线程状态为"Runnable",表示线程已经准备好并等待获取CPU时间片。 接着,我们主线程睡眠1秒钟,新线程有足够的时间去执行。...在新线程的run()方法中,我们线程睡眠500毫秒,模拟线程的运行。...最后,我们输出线程状态,可以看到新线程先是运行状态,然后在run()方法中调用了sleep()方法后进入了超时等待状态,最终线程执行完毕后进入终止状态。 4.

20050
领券