前言:
现在姐妹们对“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阻塞主线程