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

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

图4-5 线程启动逻辑 线程停止 线程停止的机制比较特别。...在Java层面,JDK会创建一个ThreadDeath对象,该类继承自Error,然后传给JVM_StopThread停止线程,如代码清单4-7所示: 代码清单4-7 线程停止 JVM_ENTRY(void...} JVM_END 如果要停止的线程是当前线程,那么JVM_StopThread只是让它抛出ThreadDeathError,这意味着如果捕获Error那么线程是不会停止的,如代码清单4-8所示: 代码清单...睡眠与中断 Thread.sleep()可以让一个线程进入睡眠状态,它在底层调用JVM_Sleep方法,如代码清单4-10所示: 代码清单4-10 线程睡眠 JVM_ENTRY(void, JVM_Sleep...本文给大家讲解的内容是探讨虚拟机运行时的java线程启动、停止睡眠与中断 下篇文章给大家讲解的是探讨虚拟机运行时的java线程栈帧、Java/JVM沟通 ; 觉得文章不错的朋友可以转发此文关注小编;

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

Linux 进程卡住了怎么办?

Linux 进程有两种睡眠状态: Interruptible Sleep,可中断睡眠,在 ps 命令中显示 S。处在这种睡眠状态的进程是可以通过给它发送信号来唤醒的。...Uninterruptible Sleep,不可中断睡眠,在 ps 命令中显示 D。处在这种睡眠状态的进程无法立即处理任何发送给它的信号,这也是无法用 kill 杀掉它的原因。...root@localhost:~# strace -p `pgrep ls` strace: Process 26469 attached --- SIGINT {si_signo=SIGINT, si_code...tgkill(26469, 26469, SIGINT) = 0 --- SIGINT {si_signo=SIGINT, si_code=SI_TKILL, si_pid=26469...这时如果我停止 JuiceFS 客户端进程,让它不能再处理任何 FUSE 请求(包括中断请求),这个时候如果尝试去杀它,就杀不掉了,包括 kill -9 也杀不掉,用 ps 查看进程状态,已经是 D 状态了

4.5K20

宋宝华:可以杀死的深度睡眠TASK_KILLABLE状态(最透彻一篇)

深度睡眠与浅度睡眠 众所周知,Linux的进程睡眠有两种常规状态: TASK_INTERRUPTIBLE(浅度睡眠):可以被等待的资源唤醒,也能被signal唤醒; TASK_UNINTERRUPTIBLE...祖师爷没有点明为什么磁盘读的时候不应该跑用户态去执行信号处理函数,为什么引发application break。...可杀的深度睡眠 Linux因此推出了一个特殊的深度睡眠状态,叫做 TASK_KILLABLE(可杀的深度睡眠):可以被等到的资源唤醒,不能被常规信号唤醒,但是可以被致命信号唤醒,醒后即死。...不是一定致命的信号2,为什么转化为了最最致命的信号9呢? 信号2是如何转化为信号9的? 这个时候我们重点关注kernel/signal.c内核代码中的complete_signal()函数: ?...我们通过signal(2, sigint)给信号2绑定了信号处理函数sigint(),这个时候read(fd, buf, 10)引发TASK_KILLABLE睡眠,我们无论怎么kill -2,都杀不死上面这个

1.4K20

linux系统编程之信号(一):信号基本概述

终端驱动程序将Ctrl-C解释成一个SIGINT信号,记在该进程的PCB中(也可以说发送了一个SIGINT信号给该进程)。 5....编号34以上的是实时信号,这些信号各自在什么条件下产生,默认的处理动作是什么(Term表示终止当前进程,Core表示终止当前进程并且Core Dump,Ign表示忽略该信号,Stop表示停止当前进程,Cont...表示继续执行先前停止的进程),在signal(7)中都有详细说明。...= '\n') ;     /* signal(SIGINT, SIGDFL) */     if (signal(SIGINT, oldhandler) == SIG_ERR)         ERR_EXIT...且调用schedule()使系统调度其他程序运行,     //这样比完全的死循环的好处是让出cpu     printf("pause return\n"); } 调用pause函数:将进程置为可中断睡眠状态

2.2K80

为什么说volatile+interrupt是停止线程最优雅的姿势?

正确的使用姿势是使用两阶段终止的模式,即一个线程发送终止指令,另一个线程接收指令,并且决定自己在何时停止。...while循环不断判断,如果项目中用不到while的话,可以在关键节点判断,然后退出run方法即可」 使用interrupt方法 假如我们的任务中有阻塞的逻辑,如调用了Thread.sleep方法,如何让线程停止呢...} public void stop() { taskThread.interrupt(); } } 依次调用start方法和stop方法,发现线程并没有停止...「其实当线程处于运行状态时,interrupt方法只是在当前线程打了一个停止的标记,停止的逻辑需要我们自己去实现」 「Thread类提供了如下2个方法来判断线程是否是中断状态」 isInterrupted

80230

shell -- 进程管理系列命令浅析

CMD 所下达的指令名称 STAT: R 运行状态;running or runnable (on run queue) S 可中断睡眠态; interruptible sleep (waiting...for an event to complete) D 不可终端睡眠态; uninterruptible sleep (usually IO) t 在跟踪期间被停止;stopped by...debugger during the tracing T 停止进程控制信号;stopped by job control signal X 死进程; dead (should never...image.png 常用的信号: SIGHUP: 无需关闭对应进程而直接让其重新读取其自身的配置文件; SIGINT:终止运行于前台的进程,使用Ctrl+c组合键,可以发送此信号; SIGKILL: 没有任何预兆终止正在运行的进程...,进程所有占用的资源都不会被立即回收; SIGTERM:kill命令默认发送的信号;终止进程的运行, SIGCONT:让转入后台的进程在后台继续运行; SIGSTOP:让转入后台的进程在后台停止运行;

57220

宋宝华: 聊一聊进程深度睡眠的TASK_KILLABLE这个状态

众所周知,Linux的进程睡眠有两种常规状态: TASK_INTERRUPTIBLE(浅度睡眠):可以被等待的资源唤醒,也能被signal唤醒; TASK_UNINTERRUPTIBLE(深度睡眠):可以被等待的资源唤醒...简单来说,深度睡眠的进程必须等待资源来了才能醒,在此之前,甚至你给它发任何的信号,它都不可能醒来。...那么,有的童鞋就会问,既然浅度睡眠这么好,那么还要TASK_UNINTERRUPTIBLE这种完全不响应信号的深度睡眠干什么?...Linux因此推出了一个特殊的深度睡眠状态,叫做 TASK_KILLABLE(可杀的深度睡眠):可以被等到的资源唤醒,不能被常规信号唤醒,但是可以被致命信号唤醒。...这说明kernel把其他的可能杀死这个进程的信号,譬如SIGINT,也转化为了致命的SIGKILL信号。我们现在把代码改一行,要求kernel不要把SIGINT转换为SIGKILL: ?

2.2K30

【操作系统】进程间的通信——信号

SIGCHLD——子进程已停止或退出 ​ SIGCONT ——*让暂停的进程继续执行 ​ SIGSTOP ——*停止执行(即“暂停") ​ SIGTSTP——断挂起 ​ SIGTTIN —— 后台进程尝试读操作...反之,如果该信号不在信号搁置集中,则中断当前信号处理函数,如果处于睡眠,比如sleep, 也会立即被唤醒,来执行新的这个信号处理函数,新的这个信号处理函数执行完毕后,再在返回至原来的信号处理函数继续执行..., &act, 0);//处理SIGINT停止信号 //收到SIGINT信号,如果此时再收到SIGUSR1,则会执行完后在进行SIGUSR1信号处理。...信号,如果此时再收到SIGUSR1,则会执行完SIGINT的信号处理函数后再进行SIGUSR1信号处理,因为SIGUSR1被加入到了响应SIGINT信号的信号搁置集中。...结果如下图所示: 先收到SIGUSR1信号,如果此时再收到SIGINT,则会先执行SIGINT的信号处理函数后再回来继续进行SIGUSR1信号处理函数的执行。

47110

【Linux】从零开始认识进程 — 中篇

S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep)) D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态...T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。...这是为什么怎么会是休眠状态(sleep),明明一直在运行啊!?...该休眠成为可中断睡眠,随时可以被外界唤醒。 代表子啊前台运行,在./ 可执行程序 后加&会在后台运行,就不带加号了。...在来看暂停状态 : T(让进程先暂停,等待被唤醒) 使用 kill 命令可以进程发信号,kill具有以下信号(宏定义信号): 1) SIGHUP 2) SIGINT 3) SIGQUIT 4)

7710

Tomcat进程意外退出,元凶居然是他...

这是一个有趣的现象,catalina.sh start方式启动的tomcat会把java进程挂到init(进程id为1)的父进程下,已经与当前test.sh进程脱离了父子关系,也与ssh进程没有关系,为什么关闭...确定了是由signal引起的之后,我的疑惑变成了: 1) 为什么SIGINT (kill -2) 不会让tomcat进程退出?...2) 为什么SIGHUP (kill -1) 会让tomcat进程退出?...交互模式与非交互模式对作业控制(job control)默认方式不同 为什么在交互模式下shell不会对后台进程处理SIGINT信号设置为忽略,而非交互模式下会设置为忽略呢?...还是比较好理解的,举例来说,我们先某个前台进程运行时间太长,可以ctrl-z中止一下,然后通过bg %n把这个进程放入后台,同样也可以把一个cmd &方式启动的后台进程,通过fg %n放回前台,然后在ctrl-c停止

3.9K10

sigaction介绍

信号来了,进入信号处理函数,默认情况下,在信号处理函数未完成之前,如果又来了一个SIGINT信号,其将被阻塞,只有信号处理函数处理完毕,才会对后来的SIGINT再进行处理,同时后续无论来多少个SIGINT...,仅处理一个SIGINT,sigaction会对后续SIGINT进行排队合并处理。...SIGQUIT,来了SIGINT,则首先处理SIGINT,然后接着处理SIGQUIT。...非终端来的停止信号 SIGTSTP 停止进程 终端来的停止信号 SIGCONT 忽略信号 继续执行一个停止的进程 SIGURG 忽略信号 I/O紧急信号 SIGIO 忽略信号 描述符上可以进行...I/O SIGCHLD 忽略信号 当子进程停止或退出时通知父进程 SIGTTOU 停止进程 后台进程写终端 SIGTTIN 停止进程 后台进程读终端 SIGXGPU 终止进程 CPU时限超时

97110

Golang中的热重启

什么是热重启 所谓热重启, 就是当关闭一个正在运行的进程时,该进程并不会立即停止,而是会等待所有当前逻辑继续执行完毕,才会中断。...其中child是子进程的标志,我们可以看到在子进程分支中,通过os.NewFile(3,"")打开了文件描述符为3的文件并转为网络监听句柄(至于为什么是3呢,而不是0、1或者其他数字?...fmt.Printf("graceful restart failed: %v\n", err) } //更新当前pidfile updatePidFile() //带超时的优雅停止...、SIGTERM和SIGHUP信号,其中,对于SIGINT和SIGTERM信号,我们认定为终止信号,需要graceful stop。...需要注意的是,为了实现graceful stop,在以往我们需要自己实现一个这样的shutdown功能: 1.关闭listenr,停止接收新请求; 2.通过sync.WaitGroup.wait()阻塞服务退出

4.3K82

Tomcat 进程意外突崩,元凶居然是它...

这是一个有趣的现象,catalina.sh start方式启动的tomcat会把java进程挂到init(进程id为1)的父进程下,已经与当前test.sh进程脱离了父子关系,也与ssh进程没有关系,为什么关闭...确定了是由signal引起的之后,我的疑惑变成了: 1) 为什么SIGINT (kill -2) 不会让tomcat进程退出?...2) 为什么SIGHUP (kill -1) 会让tomcat进程退出?...交互模式与非交互模式对作业控制(job control)默认方式不同 为什么在交互模式下shell不会对后台进程处理SIGINT信号设置为忽略,而非交互模式下会设置为忽略呢?...还是比较好理解的,举例来说,我们先某个前台进程运行时间太长,可以ctrl-z中止一下,然后通过bg %n把这个进程放入后台,同样也可以把一个cmd &方式启动的后台进程,通过fg %n放回前台,然后在ctrl-c停止

91410
领券