`

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

 
阅读更多

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

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

睡眠和中断

一、线程睡眠

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并发编程_设计原则和模式(CHM)

    Java并发编程是软件开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。本资源"Java并发编程_设计原则和模式(CHM)"聚焦于Java语言在并发环境下的编程技巧、...

    深入理解并发编程

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

    【Kotlin并发编程】基于协程与线程的高效并发编程教程:从基础到实战的全面解析

    内容概要:本文详细介绍了Kotlin中的并发编程技术,涵盖线程和协程的基础知识、协程的生命周期管理、结构化并发、异常处理、并发数据结构、原子操作、通道通信机制以及实际应用场景。文章通过丰富的代码示例,逐步...

    java高并发编程第一版

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

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

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

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

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

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

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

    Go语言并发编程教程:深入讲解 goroutine、channel 及 sync 包的应用与优化技巧

    内容概要:本文全面介绍了Go语言的并发编程模型,重点探讨了 goroutine 和 channel 这两个关键组件及其详细应用案例,涵盖创建和使用 goroutine、不同类型的 channel、sync 包提供的并发工具,还包括生产者-消费者...

    Java 并发核心编程

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

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

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

    JAVA并发编程艺术pdf版

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

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

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

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

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

    Java并发编程的设计原则与模式

    在Java编程领域,并发编程是一项核心技能,尤其是在多核处理器和分布式系统中,它能显著提升应用程序的性能和效率。本文将深入探讨Java并发编程的设计原则与模式,旨在帮助开发者理解并有效地应用这些原则和模式。 ...

    Java 并发编程实战.pdf

    通过上述内容的学习,开发者不仅能掌握Java并发编程的基本原理和技术要点,还能学会如何将这些理论应用于实际工作中,解决复杂的多线程问题。无论是对于初学者还是有一定经验的开发者来说,《Java并发编程实战》都是...

    java并发编程艺术

    总而言之,《Java并发编程艺术》这本书将系统性地介绍Java并发编程的各种技术和最佳实践,帮助读者提升在多线程环境下的编程能力,从而设计出更加健壮、高效的Java应用。无论你是初级开发者还是经验丰富的工程师,这...

    C++并发编程实践 C++ Concurrency in Action

    ### C++并发编程实践 ...通过上述各章节的学习,读者不仅能够掌握C++并发编程的基本概念和技术,还能了解如何设计高性能、可靠的并发程序。这本著作是任何希望深入了解C++多线程编程领域的开发者的宝贵资源。

    java并发编程2

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

Global site tag (gtag.js) - Google Analytics