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

Java线程概述及API一

 
阅读更多

1 创建线程与创建线程运行时代码

在Java中,创建线程的方式只有一种,就是创建Thread对象的实例。创建线程运行时代码有三种方式:

第一种:继承Thread类,覆写其run方法。

第二种:实现Runnable接口,实现run方法,Thread类也实现了Runable接口。

第三种:实现Callable接口,实现其call方法,这种方式是在JDK1.5中的java并发包中引入的。

 

start()方法与run()方法的区别

start()方法用于启动线程,start方法调用之后,线程进入可运行状态,一旦线程调度程序调度执行,线程即进入运行状态,线程启动后JVM才会给线程分配相应的资源,例如栈内存空间。然后回调线程运行时代码。

run()方法用于执行线程的运行时代码,如果直接调用该方法并没有创建新的线程而是在当前线程中被执行。

 
覆盖了Thread对象的run方法,同时传入一个Runnable的实现类?

我们知道线程创建完成之后,然后JVM回调线程运行时代码run(),所以查看Thread的默认run()实现:

 

/* What will be run. */
private Runnable target;
....
@Override
public void run() {
    if (target != null) {
        target.run();
    }
}

 

 其中target就是Runable对象,默认的run方法的逻辑是,如果传递了Runnable的实现类,就运行Runnable的run方法。故:当覆盖了Thread对象的run方法之后,执行的肯定是覆盖之后的逻辑,原来的这段逻辑如果不存在了,

就算传入了Runnable的实现类,也不会执行。

 

最后,Thread对象实现了Runnable接口(实现了run方法),而构造方法中又可以接受一个Runnable接口的实现类(也实现了run方法),称之为target,在执行的时候,如果target存在,就执行target的run方法。这实际上是装饰者设计模式(又称包装设计模式)

 

sleep()方法与wait()方法的区别

sleep()方法是Thread类中定义的静态方法,作用是让当前线程进行休眠暂停执行,在休眠期间线程不会请求CPU执行,因此其他线程(甚至更低优先级的线程)可以获得更多的运行机会。但是如果持有同步锁,并不会释放锁。

sleep方法有InterruptedException编译时异常需要捕获。并且不能指定休眠某一特定的线程t.sleep(),它只会是使当前线程被sleep 而不是t线程,所以即使t.sleep(...)这样调用,被暂停的也不是t线程而是当前线程,正确的用法应该是Thread.sleep(...)。调用sleep方法,线程进入到阻塞状态并不释放所占有的资源,sleep方法结束返回之后,线程重新回到可运行状态,而不是运行状态,需要线程调度机制重新恢复其到运行状态。

 

另外,java.util.concurrent.TimeUnit类的提供了语义更明确的sleep封装实现,其底层还是调用了Thread.sleep(...)方法,只是其单位更明确,例如休眠2秒钟:TimeUnit.SECONDS.sleep(2);

 

wait()方法是Object类中定义的方法,只能在同步方法或者同步代码块中调用,如果持有同步锁,会释放锁,让其他需要获得该锁的线程有机会运行。当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同)

wait方法同样也可以在wait期间因为被其他对象调用interrupt()方法二产生InterruptedException运行时异常。一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程。调用wait或者notify的时候,当前线程必须要是对象lock的拥有者,否则会抛出IllegalMonitorStateException异常。

synchronized (share) {
   share.wait();
}

 当线程在synchronized中调用了share.wait()时,在放弃了CPU的同时,也放弃了share这个对象的lock,进入这个对象的wait pool。

当另外一个线程调用了share.notify()时,将从wait pool中拿出一个线程,让该线程获得lock,并进入可运行状态,等待线程调度执行。

这也就是为什么wait/notify需要加锁的原因。

 

5 线程挂起与恢复suspend/resume

suspend可以将正在执行的线程挂起暂停执行。resume即使线程从挂起状态恢复。但这两个 API 是过期的,也就是不建议使用的。因为suspend()方法在执行时不会释放线程占用的资源(比如同步锁),并且没有超时时间的设定,如果resume在suspend之前调用或者在同步块内部执行,并且同步锁已经被挂起的线程占用,那么将陷入死锁状态。对于被挂起的线程,使用jconsole查看它的线程状态居然还是 Runnable。

 

另外,System.out.println(...)也是一个同步方法, 在执行打印之前需要获取PrintStream对象锁。并且PrintStream的实例对象out是System类的一个静态实例,System类中只有唯一的一个PrintOut对象:

public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
}

 

 所以下面的代码将永远无法打印出main end!,因为挂起的thread线程占用了PrintStream对象锁---out.

public class MyThread extends Thread{
	private long i = 0;
	
    @Override
    public void run() {
        while (true) {
            i++;
            System.out.println(i);//同步方法
        }
    }
    
    public static void main(String[] args) throws Exception{
    	MyThread thread = new MyThread();
    	
    	thread.start();//启动一个线程'thread'
    	
    	Thread.sleep(1000l);//使当前线程(main线程)睡眠
    	
    	thread.suspend();//挂起线程'thread'
    	
    	System.out.println("main end!");
	}
}
分享到:
评论

相关推荐

    JAVA_API1.6文档(中文)

    javax.imageio.spi 包含用于 reader、writer、transcoder 和流的插件接口以及一个运行时注册表的 Java Image I/O API 包。 javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I...

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

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

    java线程使用教程

    Java线程是Java程序设计中非常重要的一个部分,掌握好线程的基础知识和高级用法对于写出高性能、高可用性的Java程序至关重要。无论是处理用户界面响应性、利用多核处理器优势还是进行并发编程,都需要深入理解和灵活...

    Java 1.6 API 中文 New

    javax.imageio.spi 包含用于 reader、writer、transcoder 和流的插件接口以及一个运行时注册表的 Java Image I/O API 包。 javax.imageio.stream Java Image I/O API 的一个包,用来处理从文件和流中产生的低级别 I/...

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

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

    Java语言概述 ppt

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

    JAVA JDK1.6 API中文帮助文档

    JDK1.6是Java历史上的一个重要版本,提供了丰富的API(应用程序接口)供开发者使用。API文档是Java开发者的重要参考资料,它详细阐述了每个类、接口、方法和常量的功能、用法及参数说明,极大地方便了开发过程。 **...

    JAVA API字典

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

    java_jdk_api

    以上是对Java JDK API的一个全面概述,涵盖了它的重要组成部分和主要功能。在实际开发中,理解并熟练使用这些工具和API是成为一名高效的Java开发者的必备技能。通过学习和实践,你可以利用Java JDK API构建各种复杂...

    java线程定时启动

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

    javaApi 中文版

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

    java线程学习笔记

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

    Java api html完整中文版

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

    javaApi帮助文档

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

    Java_API中文完整版

    然而,基于标题“Java_API中文完整版”和描述“Java_API中文完整版Java_API中文完整版”,我们可以推断出这份材料可能是关于Java API的一个文档或者资源集合。为了更好地满足您的需求,我们将从Java API的基本概念、...

    java语言重要概述

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

    java1.8中文API

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

    Java程序设计基础:Java语言概述.pptx

    1996年1月,Java的第一个开发包JDK1.0发布。 Java历史网站 Java语言特点 Java极其流行,其设计特性:“一次编译,到处运行”。 简单性(simple) 面向对象(object oriented) 分布式(distributed) 解释型...

    Java中文JDK_API帮助文档1-13共26分卷

    《Java中文JDK_API帮助文档1-13共26分卷》是针对Java开发者极其重要的参考资料,它包含了从基础到高级的Java开发所需的所有API(应用程序编程接口)的详细说明,以中文语言呈现,方便中国开发者理解和使用。...

    java1.6英文api_html

    1. **API(Application Programming Interface)概述** API 是一组预先定义的函数、类、接口和枚举,为软件开发提供标准接口,使程序员可以利用这些接口来构建应用程序。Java API 涵盖了 Java 核心库的各个方面,...

Global site tag (gtag.js) - Google Analytics