`

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

 
阅读更多

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

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

睡眠和中断

一、线程睡眠

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的不同之一。

 

分享到:
评论

相关推荐

    C++并发编程实战:示例源源码

    并发编程是现代多核处理器环境下提高软件性能的关键技术,C++作为一门强大且灵活的编程语言,提供了丰富的工具和机制来支持并发。 在C++中,并发主要涉及以下几个核心概念: 1. **线程**:线程是程序执行的最小...

    Java并发编程:设计原则与模式(第二版).rar

    《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java平台上的多线程和并发编程的著作。本书旨在帮助开发者理解和掌握在Java环境中进行高效并发处理的关键技术与设计模式。以下是对该书内容的一些核心知识...

    Java并发编程:设计原则与模式(第二版)-3

    《Java并发编程:设计原则与模式(第二版)》是一本深入探讨Java多线程编程技术的权威著作。这本书详细阐述了在Java平台中进行高效...《Java并发编程:设计原则与模式(第二版)》是一本值得反复研读和实践的参考书籍。

    Java并发编程:设计原则与模式(第二版)

    Java并发编程:设计原则与模式(第二版).pdf

    深入理解并发编程

    并发编程是计算机科学中的一个复杂领域,它涉及到同时运行多个任务,以提高程序的性能和效率。它在现代多核处理器和多处理器计算环境中尤其重要,因为这些环境允许并行执行多个计算。并发编程可以用于操作系统、...

    java高并发编程第一版

    7. **并发编程最佳实践**:书中会讨论如何避免并发编程中的常见陷阱,比如避免过度同步、正确处理中断、避免死锁和饥饿等问题。此外,还会讲解如何进行并发性能调优,包括使用JVM的监控和调试工具。 8. **原子操作...

    C#中的并发编程模式:提升应用性能的关键策略

    C#作为.NET框架的一部分,提供了丰富的并发编程工具和模式,使得开发者能够有效地编写多线程应用程序。本文将详细介绍C#中的并发编程模式,包括线程的使用、任务并行库(TPL)、异步编程模型(APM)以及数据并发的...

    深入理解高并发编程(冰河原创电子书)

    全网首个最全的免费开源的高并发电子书,内容涵盖源码分析、基础案例、实战案例、面试和系统架构,内含秒杀系统和分布式锁的完整架构过程,历时半年精打细磨,一经发布,火遍全网,至今全网累计下载60万+,无论是刚...

    java并发编程:设计原则与模式.rar

    《Java并发编程:设计原则与模式》是一本深入探讨Java多线程编程的书籍,它涵盖了并发编程中的关键概念、原则和模式。在Java中,并发处理是优化应用程序性能、提高资源利用率的重要手段,尤其在现代多核处理器的环境...

    Python并发编程详解:多线程与多进程及其应用场景

    内容概要:本文深入探讨了Python中的并发编程概念,特别是多线程与多进程的应用及其在不同负载情况下的优劣。通过对I/O密集型和CPU密集型任务的对比分析以及GIL(全局解释器锁)所带来的影响,介绍了具体实例,帮助...

    java 并发编程的艺术pdf清晰完整版 源码

    这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 并发编程是现代计算机系统中不可或缺的一部分,尤其是在多核处理器成为主流的...

    Java 并发核心编程

    ### Java 并发核心编程知识点解析 #### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这...理解和掌握这些概念和技术是成功进行并发编程的关键。

    JAVA并发编程艺术pdf版

    《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...

    java并发编程实战源码,java并发编程实战pdf,Java

    理解线程的概念和生命周期对于并发编程至关重要。 2. **线程安全**:当多个线程访问同一块资源时,如果需要保证数据的一致性和完整性,就需要考虑线程安全问题。Java提供了各种手段来实现线程安全,如synchronized...

    深入理解高并发编程-核心技术原理

    【深入理解高并发编程-核心技术原理】是一本专注于讲解高并发编程核心概念和技术的书籍,由阿里P8级别的架构师及Mykit系列开源框架作者撰写。本书内容涵盖源码分析、基础案例、实战案例和面试相关知识,旨在帮助读者...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期.mp4 │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力...

    Java 并发编程实战.pdf

    在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程对于提高Java应用的性能和响应能力至关重要。 书中会首先介绍Java并发编程的基础知识,包括线程的创建和运行,同步机制的基本用法,以及Java...

    java并发编程2

    Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...

    java并发编程与实践

    在Java编程领域,并发编程是一项核心技能,尤其是在大型系统或分布式应用中,高效地处理多线程和并发操作是至关重要的。"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效...

Global site tag (gtag.js) - Google Analytics