`

并发编程回顾:睡眠和中断

 
阅读更多

原先多线程并发编程的学习笔记和代码整理一下贴上来。

---------------------------------

睡眠和中断

一、线程睡眠

1、sleep

Thread.sleep(time)方法应该比较常用,即在指定的毫秒数内让当前正在执行的线程休眠,如果有线程中断了当前线程,则抛出InterruptedException异常,且当前线程的中断状态被清除。

注意线程sleep时并不释放锁。

在javase5中java.util.concurrent.TimeUnit枚举类提供了另一种sleep方式:

TimeUnit.SECONDS.sleep(1);//1s
TimeUnit.MINUTES.sleep(1);//1min
...

这种方式不需要以毫秒作为时间单位,功能与sleep相同。

JDK文档:TimeUnit表示给定单元粒度的时间段,它提供在这些单元中进行跨单元转换和执行计时及延迟操作的实用工具方法。

二、线程中断

线程在sleep时,可以将其中断,但如果是因IO阻塞或synchronized同步导致的线程挂起,是不能被中断的。

1、sleep、io、synchronized中断

先定义3个任务:

sleep任务:睡眠5s

class SleepBlocked implements Runnable{
	public void run() {
		try {
			System.out.println("Sleep Block.");
			TimeUnit.SECONDS.sleep(5);
		} catch (InterruptedException e) {
			System.out.println("Sleep Interrupted!");
		}
		System.out.println("Exiting Sleep run...");
	}
}

IO阻塞任务:读数据

class IOBlocked implements Runnable{
	private InputStream in;
	public IOBlocked(InputStream is){
		this.in=is;
	}
	public void run() {
		try {
			System.out.println("I/O Blocked.");
			in.read();//读数据
		} catch (IOException e) {
			if(Thread.currentThread().interrupted()){
				System.out.println("Interrupted from I/O");
			}
		}
		System.out.println("Exiting IOBlocked run...");
	}
}

synchronized阻塞任务:block方法定义为synchronized,且方法内部无限循环会一直持有锁。

class SynchronizedBlocked implements Runnable{
	public synchronized void block(){
		System.out.println("Synchronized Blocked.");
		while(true){
			Thread.yield();//让步给其它线程
		}
	}
	public void run() {
		block();
		System.out.println("Exit SynchronizedBlocked...");
	}
}

测试时,先启动这3个任务,然后分别中断掉这三个任务。

ExecutorService exec=Executors.newCachedThreadPool();
Future f=exec.submit(new SleepBlocked());
Future f1=exec.submit(new IOBlocked(System.in));
Future f2=exec.submit(new SynchronizedBlocked());
Thread.yield();//让步一下
f.cancel(true);//true - 中断,false - 允许任务执行完
f1.cancel(true);
f2.cancel(true);

注意,取消任务时cancel的参数代表是否采用中断的方式结束。这里采用中断的方式,看看输出:

Sleep Block.
I/O Blocked.
Synchronized Blocked.
Sleep Interrupted!
Exiting Sleep run...

由此可见,3个任务启动后,分别进入阻塞状态,但只有sleep的中断起了作用,IO和synchronized的任务都没有被中断,而是处于一直阻塞等待的状态。

2、ReentrantLock中断

与synchronized不同的是,javase5的ReentrantLock是可以被中断的。这也是除了trylock外ReentrantLock与synchronized另一个不同点。

上代码:

首先,定义一个类

class ReentrantInterruptTask{
	private Lock lock=new ReentrantLock();	
	public ReentrantInterruptTask(){
		lock.lock();//创建对象时就获取锁.
	}	
	public void block(){
		try {
			System.out.println("blocking...");
			lock.lockInterruptibly();//线程阻塞,等待锁可用或者被中断。
			System.out.println("this line not display.");
		} catch (InterruptedException e) {
			System.out.println("lock Interrupted!");
		}
		System.out.println("Exit block...");
	}
}

该类在创建时的构造函数里就获取锁,然后在block方法中也去获取锁:

lock.lockInterruptibly():如果当前线程已经保持锁,则立即返回,如果锁被另一个线程保持,则该线程一直处于休眠状态,直到获取到锁或者当前线程被中断。

然后,定义一个任务,使该线程在block方法内阻塞:

class BlockTask implements Runnable{
	private ReentrantInterruptTask rit = new ReentrantInterruptTask();
	
	@Override
	public void run(){
		rit.block();
		System.out.println("after block...");
	}
}

最后启动并中断该线程:

Thread t=new Thread(new BlockTask());
t.start();
TimeUnit.SECONDS.sleep(2);
t.interrupt();//

控制台输出:

blocking...
lock Interrupted!
Exit block...
after block...

由此可见,使用Lock接口的lockInterruptibly是可以实现因同步而阻塞的线程被中断的,这也是lock跟synchronized的不同之一。

 

分享到:
评论

相关推荐

    unix程序课程的ppt-2

    首先,回顾了上一讲的内容,包括80386 CPU的实模式与保护模式、特权级别、分段与分页的原理,以及系统调用和软中断在进程切换中的作用。此外,还提到了Unix系统中对文件和设备的操作,如文件描述字、设备文件、文件...

    UNIX 高级教程系统技术内幕

    3.1.3 并发和并行 3.2 基本抽象概念 3.2.1 内核线程 3.2.2 轻量级进程 3.2.3 用户线程 3.3 轻量级进程设计——要考虑的问题 3.3.1 fork 的语义 3.3.2 其他的系统调用 3.3.3 信号传递和处理 3.3.4 可视性 3.3.5 堆栈...

    DeepSeek入门宝典:赋能开发者实战的高性能AI解决方案

    内容概要:本文档详细介绍了 DeepSeek 这一高效、经济的人工智能解决方案,旨在为企业端、产品端以及开发者提供深度技术支持。对于企业而言,DeepSeek 带来了显著的成本效益和生产效率提升;而对于具体的产品和服务,它增强了用户体验的质量。特别是针对开发者,文档深入浅出地讲解了如何利用 DeepSeek 实现自动化代码生成、改写等辅助开发功能,并且提供了具体的步骤指导以满足不同环境下的部署需求,包括直接通过官方API接入、本地私有化部署或借助云平台进行托管的方式。 适合人群:希望降低开发门槛,提高工作效率的软件工程师和技术团队。 使用场景及目标:开发者可以根据自身条件选择最适合自己的部署方案来整合 DeepSeek 技术,进而达到优化编码过程、减少人为错误的目的。 其他说明:文中还包括了许多实际操作的例子,如通过代码改写的实例来展示如何改进现有程序段落,还有详细的API使用指南帮助初学者快速上手DeepSeek。此外,还提供了大量外部参考资料链接以便进一步扩展知识和技能范围。

    lusted_3cd_01_0318.pdf

    lusted_3cd_01_0318

    开源AI工具下载——Cherry-Studio-1.0.1-MACOS arm64版

    Cherry Studio是一款支持多模型服务的 Windows/macOS GPT 客户端。通过与Ollama搭配,搭建个人本地AI大模型

    chromedriver-win64-136.0.7058.0.zip

    chromedriver-win64-136.0.7058.0.zip

    matlab程序代码项目案例:使用 Simulink 进行自适应 MPC 设计

    matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    mellitz_3cd_01_1116.pdf

    mellitz_3cd_01_1116

    基于MATLAB的牛顿迭代法实现

    基于MATLAB的牛顿迭代法实现

    steenman_01_0908.pdf

    steenman_01_0908

    [AB PLC例程源码][MMS_047737]System Time 64Bit Interpreted AOI.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    stone_3ck_01a_0518.pdf

    stone_3ck_01a_0518

    [AB PLC例程源码][MMS_041473]Input Time Stamping.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    lusted_3cd_01_1117.pdf

    lusted_3cd_01_1117

    2010-2023年 上市公司-管理层情感语调数据.zip

    管理层情感语调,或称为管理层语调,是一个在财务与会计领域中常用的概念,特别是在分析上市公司信息披露质量时。它主要指的是管理层在上市公司文字信息披露过程中,用词所体现出的情感倾向和可理解性。 本数据复刻了《财经研究》《中南财经政法大学学报》等顶级期刊的核心解释变量的做法。情感语调对企业未来盈余和未来绩效具有较强解释力、降低会计信息误定价、为分析师预测提供增量信息,而投资者也会对管理层情感语调做出积极反应。 情感语调1=(正面词汇数量-负面词汇数量)/词汇总量;数值越大,情感倾向越偏向正面积极。 情感语调2=(正面词汇数量-负面词汇数量)/(正面词汇数量+负面词汇数量);数值越大,情感倾向越偏向正面积极。 指标 证券代码、企业代码、年份、证券简称、行业代码、行业名称、正面词汇数量、负面词汇数量、词汇总量、句子数量、文字数量、情感语调1、情感语调2。

    mellitz_3cd_02_0318.pdf

    mellitz_3cd_02_0318

    moore_01_0909.pdf

    moore_01_0909

    lusted_3ck_02a_0119.pdf

    lusted_3ck_02a_0119

    pimpinella_3cd_01_0916.pdf

    pimpinella_3cd_01_0916

    [AB PLC例程源码][MMS_041392]Mill feed and Auxilary Control.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

Global site tag (gtag.js) - Google Analytics