`
joker_zhou
  • 浏览: 6239 次
社区版块
存档分类
最新评论

Java并发学习笔记(4)线程的取消,关闭和异常终止

 
阅读更多

首先,要说的是java中没有一种停止线程的方法是绝对安全的.

线程的中断

Thread.interrput()方法很容易给人一种误会,让人感觉是一个线程使另外一个正在运行的线程停止工作,但实际上interrput仅仅传递了请求中断的信息.线程自己会在下一个方便的时间中断.某些操作会接受这个请求时发出一个异常,比如wait,sleep.每一个Thread线程都有一个中断状态,是boolean型的当调用interrput方法后会使中断为true.当使用的静态的interrputed时可以清除中断状态,也就是说连续调用2次interrputed会将中断状态变为false.isInterrupted方法可以返回中断状态.有时候调用interrput方法会出现异常而且中断状态没有改变,你可以在异常处理catch块中使用interrupted=true重试.

Java中断线程的时候分两种情况:第一种是在线程正常执行时,第二种是在线程阻塞时.

(1) 正常线程运行时一般会运行一个较长的任务有的会在while(true)中,这种线程最好中断只需要在循环中加入一个if(){break};判断就好.while判断条件是中断状态.嘿.

(2)在线程阻塞的时候进程不会执行其他任何命令,所以不能改变判断状态.这时候使用Thread.interrupt()方法产生一个InterruptedException运行时异常,在catch块中,跑出一个运行时异常(RuntimeException)或使用break;这种方法可以适用于{ Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中阻塞的线程,能看出来这些方法都会跑出InterruptedException异常}

 

  1. try {  
  2.     TimeUnit.SECONDS.sleep(1);  
  3. catch (InterruptedException e) {  
  4.     break;  
  5.     thrownew RuntimeException();  
  6. }  

 

(3)你不可以中断试图获取synchronized锁但是由于锁被占用未被释放而被挂起的线程或者试图执行I/O操作的线程.

a)  对于IO异常

i.  对于被I/O读写阻塞的线程嘴简单直接的方法是调用基础资源的close()方法.也就是读写的close方法.(旧IO不会发出InterruptedException异常但是使用close方法会跑出IOException异常同上使用相同方法可以跳出循环中断线程)

ii. 在新版本的nio类会自动响应中断,发出IOException异常

b) 对于由于互斥堵塞.使用ReentrantLock对象加锁的线程可以被终结,使用ReentrantLock的lockInterruptibly方法,如果当前线程未被中断,则获取锁这就可以中断被互斥的锁。

c)处理反常的线程终止

 

在并发程序中,发生异常而未能捕获异常这使得线程执行失败,但是往往这种失败,不会影响程序的继续执行.导致失败的主要原因还是RuntimeException这种异,通常这种异常是不能捕获的.如何捕获这些异常呢.?javaAPI提供了这一类问题的解决办法,提供了Thread.UncaughtExceptionHandler(异常处理器具体查看JDK)使你能够检测到线程因未捕获而引起的线程死亡.可以使用Thread的set方法设置异常处理器.如果不存在异常处理器则使用System.err输出.PS:在运行时间较长时间的线程里,为线程提供一个异常处理器是有必要的,至少在这个处理器中记录日志.为了给线程池中的每个线程都加入异常处理器,可以在建造线程池的时候给定一个ThreadFactory.为每个线程池内的Thread加入异常处理器.PS.线程池只有通过execute方法才会将异常交给异常处理器.通过submit方式提交的会使用get方法重新给出异常.使用异常处理器后不会使用system.err向控制台写入异常.

分享到:
评论

相关推荐

    JAVA并发编程实践-线程的关闭与取消-学习笔记

    在Java并发编程中,线程的关闭和取消是一项重要的任务,因为不正确的处理可能导致数据不一致、资源泄漏等问题。在Java中,强制停止线程并不是一个推荐的做法,因为这可能会导致系统状态的不稳定。传统的`Thread.stop...

    java线程学习笔记

    Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...

    Java并发编程(学习笔记).xmind

    任务的取消和关闭 任务取消 停止基于线程的服务 处理非正常的线程终止 JVM关闭 线程池的定制化使用 任务和执行策略之间的隐性耦合 线程池的大小 配置ThreadPoolExecutor(自定义的线程池)...

    java并发笔记,包含线程池

    Java并发编程是Java开发中的重要领域,特别是在大型系统和服务器端应用中,高效地利用多核处理器资源,实现高并发性能至关重要。...通过深入学习和实践,开发者可以更好地驾驭Java并发,提升程序的性能和稳定性。

    Java多线程学习笔记

    ### Java多线程学习笔记 #### 一、线程的基本概念 在计算机科学中,**线程**(Thread)是程序执行流的最小单位。一个标准的程序只能做一件事情,而通过多线程技术,可以让程序同时处理多个任务。在Java中,线程是...

    java多线程笔记全手打

    线程中的异常如果不捕获处理,将导致线程异常终止。`Thread.UncaughtExceptionHandler`接口用于定义线程未捕获异常的处理逻辑。 九、线程安全问题 线程安全主要涉及原子性、可见性和有序性问题。Java提供了一系列...

    多线程-狂神说Java学习笔记

    本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...

    Java分布式应用学习笔记07线程池应用

    线程池是Java并发编程的核心技术之一,它通过复用一组预创建的线程来执行任务,从而减少了创建和销毁线程的开销,提高了系统的响应速度和处理能力。 #### 线程池的作用 线程池可以显著提高多线程应用的性能和效率...

    多线程笔记_java/多线程_

    在Java编程语言中,多线程是程序设计中的一个重要概念,尤其在开发高效能和响应迅速的应用时。本文档将全面解析多线程的基础知识,从简单到复杂,帮助开发者深入理解并掌握这一核心技术。 一、多线程基础 1.1 线程...

    Java学习笔记(详细)

    以上只是Java学习笔记的一部分,深入学习还需要涵盖更多主题,如IO流、网络编程、反射、设计模式等。Java的深度和广度使其成为企业级应用开发的重要选择,熟练掌握Java能为程序员的事业发展打下坚实基础。

    java7源码-Concurryency-Learning:并发编程学习笔记

    Java并发编程学习笔记 本项目整理自《Java7并发编程实战手册》,感兴趣的话推荐阅读原著 本章内容包括: 线程的创建和运行 线程信息的获取和设置 线程的中断 线程中断的控制 线程的Hibernate和恢复 等待线程的终止 ...

    达内java培训笔记

    这份“达内java培训笔记”涵盖了Java学习的重要概念和关键知识点,旨在帮助学员深入理解和掌握这门强大的语言。 一、Java基础 Java的基础包括语法、数据类型、变量、运算符和控制结构。学习Java首先要了解其基本的...

    08-java基础汇总学习笔记

    4. **线程与并发**:`线程的生命周期.png`描绘了线程的五种状态,包括新建、就绪、运行、阻塞和终止。`30-多线程.txt`可能包含了线程同步、线程通信(如wait()、notify()、notifyAll()方法)以及死锁的概念。 5. **...

    22222222222222

    3. **异常处理**:Java中的异常处理机制是程序健壮性的保障,通过try-catch-finally语句块来捕获和处理运行时错误,确保程序在遇到问题时能优雅地终止。 4. **集合框架**:Java集合框架包括List、Set、Map等接口...

    多线程学习笔记.docx

    在多线程编程中,进程和线程是两个核心概念。进程是操作系统资源分配的基本单位,每个独立执行的程序都对应一个...在实际开发中,合理利用线程池、同步机制和异常处理可以有效避免线程安全问题,提高程序的并发性能。

    java经典笔记快下载啊

    "java经典笔记"可能包含了关于Java编程的深入理解和实践经验,是学习和提升Java技能的重要资源。下面将根据这个主题,详细阐述Java编程的一些关键知识点。 1. **基础语法**:Java的基础包括数据类型(如整型、浮点...

    java多线程相关资料整理

    Java多线程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提高..."Java多线程源码笔记.pdf"这样的文档通常会涵盖以上内容,并可能包含具体的源码分析和实战案例,对于理解和掌握Java多线程编程非常有帮助。

Global site tag (gtag.js) - Google Analytics