社区
Java
帖子详情
线程的中断和阻塞的区别
qq_32466561
2018-12-15 04:38:39
线程的中断和阻塞的区别,中断后还能否还原,中断和阻断是不是一个意思
...全文
1074
2
打赏
收藏
线程的中断和阻塞的区别
线程的中断和阻塞的区别,中断后还能否还原,中断和阻断是不是一个意思
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
_jant
2018-12-17
打赏
举报
回复
线程阻塞
一个线程进入阻塞状态的原因可能如下(已排除Deprecated方法):
sleep()
sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;
当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象锁并没有被释放,其他线程无法访问这个对象(即使睡着也持有对象锁)。
wait()
调用wait()/1.5中的condition.await()使线程挂起,直到线程获取notify()/notifyAll()消息,(或者在Java SE5中java.util.concurrent类库中等价的signal()/signalAll()消息),线程才会进入就绪状态;
wait()调用会释放当前对象锁(monitor),这样其他线程可以继续进入对象的同步方法。参见上一篇文章线程间协作——wait & notify & notifyAll
另外,调用join()也会导致线程阻塞,因为源码中join()就是通过wait()实现的;
等待I/O;
class Demo3 implements Runnable throws InterruptedException{
private InputStream in;
public void run(){
in.read();
}
}
1
2
3
4
5
6
无法持有锁进入同步代码
进入同步代码前无法获取锁,比如试图调用synchronized方法,或者显示锁对象的上锁行为ReentrantLock.lock(),而对应锁已被其他线程获取的情况下都将导致线程进入阻塞状态;
注意:yield()并不会导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
线程中断
线程中断可以在线程内部设置一个中断标识,同时让处于(可中断)阻塞的线程抛出InterruptedException中断异常,使线程跳出阻塞状态。相比其他语言,Java线程中断比较特殊,经常会引起开发人员的误解。因为中断听起来高深复杂,实质原理上非常简单。
中断原理
Java中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。这好比是家里的父母叮嘱在外的子女要注意身体,但子女是否注意身体,怎么注意身体则完全取决于自己。
Java中断模型也是这么简单,每个线程对象里都有一个boolean类型的标识(不一定就要是Thread类的字段,实际上也的确不是,这几个方法最终都是通过native方法来完成的),代表着是否有中断请求(该请求可以来自所有线程,包括被中断的线程本身)。例如,当线程t1想中断线程t2,只需要在线程t1中将线程t2对象的中断标识置为true,然后线程2可以选择在合适的时候处理该中断请求,甚至可以不理会该请求,就像这个线程没有被中断一样。
十八道胡同
2018-12-17
打赏
举报
回复
https://blog.csdn.net/higherzjm/article/details/82700264
Java-并发-Java
线
程
中断
与停止
线
程详解
线
程
中断
Java 中的
线
程
中断
是一种
线
程间的协作模式,通过设置
线
程的
中断
标志并不能直接终止该
线
程的执行,而是被
中断
的
线
程根据
中断
状态自行处理。即“
线
程
中断
”并不是字面意思——
线
程真的
中断
了,而是设置了
中断
标志位为true。 thread.interrupt() 该方法“
中断
线
程”,但仅仅是会设置该
线
程的
中断
状态位为true,至于
中断
的结果
线
程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。
线
程会不时地检测这个
中断
标示位,以判断
线
程是否应该被
中断
(
中断
标示值是否为true)。它并不像stop方法那样会立即
中断
一个正在运行的
线
程,因此没有stop()方法带来的的
java
线
程
阻塞
中断
与LockSupport使用介绍
本文将详细介绍java
线
程
阻塞
中断
和LockSupport的使用,需要了解更多的朋友可以参考下
浅析java
线
程
中断
的办法
中断
线
程相关的方法
中断
线
程有一些相应的方法,这里列出来一下。 注意,如果是Thread.method(),则代表是静态方法。如果是thread.method()则代表着是类方法 void thread.stop() 这个方法能
中断
正在运行的
线
程,但是已经不推荐使用了,在将来的版本或许弃用,因为强行
中断
运行中的
线
程,是不安全的。 void thread.interrupt() 如果正在运行wait(),sleep(),join()这三个方法
阻塞
了
线
程,那么将会使得
线
程抛出InterruptedException异常,这是一个
中断
阻塞
的过程。如果是其它的正在运行的状态,那么将不会有任何影响,
线
程生命周期.pdf
以图表形式详细列出java
线
程生命周期,创建
线
程,
线
程就绪,
线
程
阻塞
,
线
程
中断
,
线
程唤醒,
线
程运行之间的关系
线
程
中断
的方法以及静态方法isInterrupted和实例方法interrupted的
区别
线
程
中断
常见的有以下两种方式: 通过共享的标记来进行沟通 调用 interrupt() 方法来通知 通过共享的标记来实现
中断
就是创建一个boolean类型的变量来控制循环是否进行,就是一个标记。 代码如下: /** * 描述:标记法
中断
线
程 */ public class ThreadDemo { private static class MyRunnable implements Runnable { public volatile boolean isQuit = false; @Override public void ru
Java
50,543
社区成员
85,619
社区内容
发帖
与我相关
我的任务
Java
Java相关技术讨论
复制链接
扫一扫
分享
社区描述
Java相关技术讨论
java
spring boot
spring cloud
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章