龙空技术网

java并发编程-线程状态,线程阻塞方式,阻塞中的线程如何终止?

全栈独立开发者 636

前言:

现在姐妹们对“python阻塞主线程”都比较关怀,小伙伴们都想要了解一些“python阻塞主线程”的相关内容。那么小编在网摘上收集了一些关于“python阻塞主线程””的相关文章,希望我们能喜欢,我们一起来学习一下吧!

前面的例子通过volatile boolean来让任务终止,那么如果任务阻塞了? 如何终止它?本文来看下,参考think in java 。

线程的状态

1、new:线程创建后的短暂状态,其分配系统资源和执行初始后,调度器会将其分配到Runnable或blocked 状态,要看CPU的时间切片

2、runnable: 就绪状态,这个状态需要根据CPU的时间切片来控制是否对线程运行或阻塞。

3、blocked: 阻塞状态,调度器不给在给它分配CPU time。直到这个线程恢复到运行状态,哪些能使线程阻塞,我们下文再说

4、dead: 死亡状态,线程被终止,比如程序执行完成或者被打断终止,这个状态不会在分配CPU time。

让线程阻塞的方式

子线程进行阻塞,有下面的原因:

1、让任务进行sleep(),在指定的睡眠时间内,线程是阻塞中的

2、线程wait() 被挂起,wait()我们专题和notify()一起学习记录。

3、线程进行I/O 操作,进行阻塞

4、线程调用synchrnoized方法在另一个对象上,这个对象被锁住。

阻塞打断

当使用Executor的时候,对其调用shutdownNow()方法将任务终止,如果你不了解,可以看之前发的文章。这个方法有个问题,就是对所有的任务调用其interrupt()打断,但是如果你指向终止单一的子线程,那么使用execute()方法就不可以了,需要使用submit()方法替换execute()方法,submit()方法返回Future对象,其可以调用cancel()方法,传递true,那么它会在其线程上面调用interrupt()打断。

Sleep 阻塞终止任务

sleep 终止我们之前学习过,今天看使用Future 阻塞单一任务的的例子,程序比较有意思:

输出结果:

程序分析:

1、子线程睡眠100秒,我们要记住sleep的时候是不释放所得,那么这个线程当sleep后,线程就阻塞住了,我们可以通过futer.cancel(true) 对齐调用thread 的interrupt方法,将其终止

2、通过输出,我们可以看到sleep的时候,打断异常能捕获

3、在异常捕获中,打断的状态被设置为false,从"sleepBlocked:false" 可以看出

I/O阻塞终止例子

下面我们看I/O阻塞终止的例子:

输出结果:

程序分析:

1、通过程序我们发现,InputStream.in() 进行阻塞,调用f.cancel(true)希望将其打断,但是通过程序结果我们发现不能成功捕获异常,也就是I/O中断不可达

2、我们后面要学NIO,带channel的,可以打断终止任务,我们后面在看。

synchrnoized阻塞中断

下面我们看synchronized阻塞,通过interrupt能否中断,看下面的代码:

输出结果:

程序分析:

1、当我们模拟2个线程,其中一个占有锁了,另一个线程阻塞着获取锁,对其进行f.cancel(true)发现不能被打断,也就是synchrnoized 阻塞不能被打断

2、使用模拟2个线程是因为,一个线程可以重入synchrnoized方法

3、我们可以使用ReentrantLock对象来代替synchronized,其可以被打断

总结下:

1、sleep 使可以被interrupt的,而synchronized和I/O 不能

2、future.cancel(true) 可以对阻塞的线程进行interrupt,终止单个任务( sleep阻塞打断例子验证)

标签: #python阻塞主线程