`
春花秋月何时了
  • 浏览: 43336 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java线程概述及API二

 
阅读更多

1 线程中断interrupt

中断机制的实现是通过一个标记中断状态(interrupt status)实现的。我们通过调用某个线程对象的interrupt方法只是来设置这个标记,而并非直接终止线程的运行。当一个线程调用了Thread的静态方法interrupted判断到自己被中断后,立即会将这个状态清空。但是如果调用Thread的实例方法Isinterrupted判断,则不会清空中断状态。总的来说,线程如何支持中断,这依赖于线程的运行时代码是如何编写的。

当使用interrupt方法中断了一个处于阻塞或者正试图执行阻塞操作的线程时,将会抛出一个InterruptedException异常,更重要的是,中断状态将会被复位。所以下面这种检测中断的方式将失效:

 Thread t1 = new Thread() {
	@Override
	public void run() {
		while (!this.isInterrupted()) { //失效的中断检测
			try {
				System.out.println("sleep()..");
				TimeUnit.SECONDS.sleep(2);
			} catch (InterruptedException e) { //抛异常就会清空中断状态
				System.out.println("InterruptedException....");
			}
		}
	}
};
t1.start();
TimeUnit.SECONDS.sleep(2);
t1.interrupt();       

 由于当InterruptedException异常被抛出之后,中断状态将被复位,所以当再次使用Isinterrupted/interrupted判断时,将仍然是非中断状态,线程将不能得到停止。

另一方面,如果线程运行时代码不存在阻塞的代码时,并且没有检测线程中断状态的机制,那么就算调用了interrupt方法中断该线程,该线程也不会得到任何响应,如下面的代码将无法中断非阻塞状态的线程:

Thread t1=new Thread(){
	@Override
	public void run(){
		while(true){
			System.out.println("未被中断");
		}
	}
};
t1.start();
TimeUnit.SECONDS.sleep(2);
t1.interrupt();

/**
 * 输出结果(无限执行):
	 未被中断
	 未被中断
	 未被中断
	 ......
 */

 所以,综上情况,最好的中断运行时代码示例如下这种形式:

public void run(){
    try {
        //判断当前线程是否已中断,注意interrupted方法是静态的,执行后会对中断状态进行复位
	    while (!Thread.interrupted()) {
	        TimeUnit.SECONDS.sleep(2);
	    }
    } catch (InterruptedException e) {

    }
}

 总结:

方法名 类型 作用 是否复位标记
public void interrupt() 实例方法    中断线程     当一个线程处于被阻塞状态或者试图执行一个阻塞操作时,使用interrupt()方式中断该线程,将会抛出一个InterruptedException的异常,同时中断状态将会被复位(由中断状态改为非中断状态)

public boolean

isInterrupted()

实例方法 判断线程是否被中断  

public static

boolean interrupted()

静态方法 判断线程是否被中断 中断状态将会被复位

特别的:抛出 InterruptedException异常的同时也会清空中断状态

 

2 线程合并Join

Thread类的非静态方法,其作用在A线程执行过程中如果调用了另外一个线程对象B的join方法B.join(),那么A线程后面的代码必须要等待B线程执行结束之后才能继续往下执行。B.Join之后,A线程进入阻塞状态,并且不会释放所占用的资源,当B线程运行结束,A线程重新进人可运行状态,等待被操作系统调度执行。

public static void main(String[] args) throws InterruptedException {
Thread t = 创建t线程实例.
t.start();//t线程启动
t.join();//合并t线程到当前线程(main线程)
System.out.println("这里的代码必须等到t线程执行结束之后才会得到执行。");
}
join方法还可以指定等待的时间,一旦A线程在等待了指定的时间后,B线程还没有结束,就不再等待,A线程再次进入可运行状态。 

3 线程让步yield

Thread类的静态方法,其作用是:使当前线程出让CPU占有权,重新退回到可运行状态,而不是阻塞状态,并不会释放所占用的资源。当线程通过yield让出CPU之后,操作系统先检测是否存在和当前线程同优先级的处于可运行状态的线程,如果有,则调度这些线程执行,如果没有,则继续调度执行当前线程。

 

sleep方法允许较低优先级的线程获得运行机会,但yield方法执行时,当前线程仍处在可运行状态,所以不可能让出较低优先级的线程此时获取CPU占有权。在一个运行系统中,如果较高优先级的线程没有调用sleep方法,也没有受到I/O阻塞,那么较低优先级线程只能等待所有较高优先级的线程运行结束,方可有机会运行。

 

yield只是使当前线程重新回到可执行状态,所以执行yield的线程在进入到可执行状态之后可能会马上又被调度执行,因为yield只能使同优先级的线程有执行的机会。

 

4 线程优先级

Thread优先级被划分1~10个级别,Thread类定义了3个整形常量:10-MAX_PRIORITY、5-NORM_PRIORITY、1-MIN_PRIORITY分别用于表示支持的最高优先级,正常优先级和最低优先级。NORM_PRIORITY 是默认优先级。

一个线程被创建时,如果没有指定优先级,则除了可以是默认值5,还可以继承父线程的优先级,当然也可以通过setPriority方法改变优先级。

优先级从设计上来说是为了达到在多线程环境中,使高优先级的线程比低优先级的线程获得更多的运行机会,但是一般不能依靠线程的优先级来决定线程的执行顺序,因为优先级需要操作系统的支持,有些操作系统会直接忽略优先级的设置,因此在实际开发中,尽量不要去设置一个线程运行时的优先级,因为结果可能不是你想要的那样。

 

5 守护线程设置setDaemon

在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)。通过调用setDeamon可以将某个用户线程标记为守护线程,故用户线程和守护线程没有本质区别,唯一的区别在于,当所有User Thread(用户线程)全部执行结束之后,JVM虚拟机将会立即退出,而并不会等待守护线程执行结束。

 

注意
1. setDaemon(true)方法的调用必须在调用start()之前设置,不能把正在运行的用户线程设置为守护线程,否则会抛出一个IllegalThreadStateException异常。
2. 在Daemon守护线程中产生的新线程也是Daemon守护线程。

 

守护线程的宗旨在于为其他用户线程的运行提供服务,比如JVM垃圾回收GC线程、内存管理线程,还有数据库应用中的连接池相关的监控线程,WEB应用中转发用户请求给实际工作线程的调度线程也可以设置为守护线程。

 

6 线程异常处理器setUncaughtExceptionHandler

当线程运行期间出现了没有被捕获的异常时,如果事先设置了异常处理器那么JVM虚拟机将会自动回调该异常处理器。线程类有两个设置异常处理器的方法:

一个是Thread类实例方法setUncaughtExceptionHandler,

一个是Thread类静态类方法setDefaultUncaughtExceptionHandler。

 

当出现未捕获的异常时,如果设置了实例异常处理器,那么JVM会首先直接调用它,如果没有,但是设置了类默认异常处理器,则JVM再调用它。

分享到:
评论

相关推荐

    java 多线程设计模式 进程详解

    第二章 Java线程API 通过Thread类创建线程 使用Runable接口的线程 线程的生命周期 线程命名 访问线程 线程的启动、停止和连接 总结 第三章 同步技术 银行的例子 异步读取数据 一个进行同步操作的类 同步块 嵌套锁...

    JAVA_API1.6文档(中文)

    本文档是 Java 2 Platform Standard Edition 6.0 的 API 规范。 请参见: 描述 Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类。 java.awt 包含...

    java线程使用教程

    ### Java线程使用教程知识点详解 #### 一、线程基础概述 - **定义与特点**:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。Java是首个在语言级别明确支持线程特性的...

    Java 1.6 API 中文 New

    java.util.concurrent.atomic 类的小工具包,支持在单个变量上解除锁的线程安全编程。 java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR ...

    JAVA常用API文档 中文完整版.zip

    在Java API文档中,我们可以找到关于Java语言的基本类、集合框架、网络编程、多线程、I/O流、反射、异常处理、国际化、日期时间、XML处理等多个领域的详细说明。以下是一些关键知识点的概述: 1. **基础类与接口**...

    Java语言概述 ppt

    以上是Java语言概述的一些核心知识点,涵盖语言基础、内存管理、异常处理、I/O、集合、多线程和网络编程等方面。通过深入学习和实践,开发者可以掌握Java编程的基本技能,并在此基础上构建复杂的应用系统。

    JAVA API字典

    以上只是Java 6 API中一部分关键知识点的概述,实际的API字典会包含更多详细的类、接口和方法描述,帮助开发者更好地理解和利用Java平台的强大功能。通过深入学习和实践,开发者可以提升编程技能,编写出高效、稳定...

    javaApi 中文版

    以上只是Java API中部分重要知识点的概述,实际的API文档中还包含了更多的类和接口,涵盖了各种功能和用途,是Java开发者必备的学习资料。通过深入理解和熟练使用Java API,开发者可以构建出稳定、高效、可扩展的...

    JAVA JDK1.6 API中文帮助文档

    API文档是Java开发者的重要参考资料,它详细阐述了每个类、接口、方法和常量的功能、用法及参数说明,极大地方便了开发过程。 **JDK1.6主要特性** 1. **泛型**:在JDK1.6中,泛型的使用更加广泛和成熟,允许开发者...

    java_jdk_api

    2. **开发工具**:JDK提供了一系列的命令行工具,如`javac`编译器将源代码编译成字节码,`java`解释器执行编译后的.class文件,`javadoc`用于生成API文档,`jdb`是Java的调试工具等。 3. **Java虚拟机(JVM)**:...

    Java api html完整中文版

    1. **Java API概述**: Java API(Application Programming Interface)是一组预先定义的类库,提供了丰富的功能和接口,使得开发者可以构建高效、可移植的应用程序。J2SE 5.0 API包含了核心Java语言库、集合框架、...

    java线程学习笔记

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

    java线程定时启动

    ### Java线程定时启动知识点详解 #### 一、概述 在Java编程中,有时我们需要让某个任务或操作在特定的时间点或每隔一段时间自动执行一次。这通常被称为“定时任务”。Java标准库提供了几种不同的方式来实现定时...

    javaApi帮助文档

    #### 一、Java API 概述 Java API(Application Programming Interface)是Java编程语言的核心组成部分之一,它提供了一系列预定义的类和接口,使得开发者能够轻松地实现复杂的功能而无需从零开始编写代码。Java ...

    java语言重要概述

    随着学习深入,还可以探索更高级的主题,如Spring框架、JPA(Java Persistence API)进行数据库操作、JavaFX进行图形用户界面开发,以及近年来热门的Java 8及更高版本的新特性,如Lambda表达式、Stream API等。...

    Java_API中文完整版

    ### Java API概述 Java API(Application Programming Interface)是指Java平台提供的一系列预定义函数,用于简化Java程序开发过程中的复杂操作。API提供了大量的类库和接口,帮助开发者实现各种功能而无需从头编写...

    java1.8中文API

    1. **Java API概述** Java API是Java语言的核心,它提供了大量的预定义类和接口,涵盖了从基本数据类型操作到网络编程、多线程、I/O流等各个领域。Java 1.8版本引入了许多新特性,如Lambda表达式、Stream API、方法...

    java api最新7.0

    JAVA开发人员最新版本7.0 api文档!本文档是 Java Platform Standard Edition 7 的 API !Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列...

    java1.6英文api_html

    Java API 涵盖了 Java 核心库的各个方面,包括集合框架、输入/输出、网络编程、多线程、图形用户界面(GUI)、数据库连接等。 2. **Java 类库** Java 1.6 包含了大量的核心库,如 `java.lang`、`java.io`、`java....

    Java_API_1.6中文版

    1. **Java类库概述**:Java API 1.6包括了Java基础类库,如集合框架、I/O流、网络编程、多线程、反射、国际化等。这些类库为开发者提供了构建复杂应用程序的基础。 2. **集合框架**:Java 1.6中的集合框架包括List...

Global site tag (gtag.js) - Google Analytics