Java实用程序设计(西电版)第10章Java线程

ID:41233103

大小:1.65 MB

页数:50页

时间:2019-08-20

Java实用程序设计(西电版)第10章Java线程_第1页
Java实用程序设计(西电版)第10章Java线程_第2页
Java实用程序设计(西电版)第10章Java线程_第3页
Java实用程序设计(西电版)第10章Java线程_第4页
Java实用程序设计(西电版)第10章Java线程_第5页
资源描述:

《Java实用程序设计(西电版)第10章Java线程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第10章Java线程10.1并发的基本思想10.2Java的基本线程机制10.3资源共享与同步10.4线程状态与生命周期10.5多线程与I/O:管道流10.1并发的基本思想在深入多线程程序设计之前,读者需要了解并发的基本思想和动机。并发的第一个动机在一些操作系统原理书籍中经常被提及,即并发能够为单处理器上的程序提供性能的提升。表面上看,单处理器上运行并发程序引入了上下文切换的开销,似乎应比同样功能的顺序程序执行得慢。但在实际系统中存在阻塞的情况。也就是说,程序中的某个任务可能会被程序控制范围外的某些条件(如输入/输出)阻塞而不能继续执行。10.2Java的基本线程机制一

2、个线程是在进程中的一个单一的顺序执行流。每一个线程都能够驱动一个独立的子任务。CPU会为每个任务分配其占用CPU的时间,程序不需要知道CPU的数量及它所占用的CPU时间。Java的线程模型可以看做是CPU、代码和数据的封装体。线程模型的CPU可以看做是线程在占用CPU时CPU的状态;代码即CPU所执行的代码,可以由多个线程共享;数据包括线程独有数据(程序计数器、栈)和共享数据(如堆上的对象)。1.创建线程线程的创建通常可以通过两种方式完成:实现Runnable接口和继承Thread类。Runnable接口是java.lang包中定义的一个接口,该接口包含唯一的抽象方法r

3、un()。Thread类则是创建线程的基础类。Thread类的构造方法可以传入三类参数:ThreadGroup类型的参数指明新线程所处的线程组;String类型的参数指明新线程的名称;Runnable接口类型的参数所指向的对象类型决定了线程的具体行为。当通过实现Runnable接口来创建线程时,要完成以下 工作:(1)定义一个类,该类实现Runnable接口,即在该类中提供run()方法的具体实现;(2)将该类的一个实例对象(可称为任务)传递给Thread类的构造方法构造线程对象。当通过继承Thread类的方法创建线程时,应通过以下两步:(1)从Thread类派生出子类

4、,并通过重写子类的run()方法提供线程体;(2)通过创建子类的对象创建线程。2.ExecutorExecutor是J2SE5.0中引入的执行器接口,它存在于java.util.concurrent包中。Executor可以帮助用户管理线程对象,从而简化编程开发。Executor将主线程与所有任务线程分隔开,能够帮助主线程管理异步任务的执行,主线程不再需要显式地管理任务线程的生命周期。与传统的线程创建方法相比,Executor是一种更优的方式。3.线程优先级线程的优先级将该线程的重要性传递给调度器。虽然CPU处理现有线程集合的顺序是不确定的,但调度器会倾向于让优先级

5、较高的线程先执行。这并不代表优先级较低的线程将得不到执行,但是优先级较低的线程的执行频率会比较低。4.睡眠sleep()与让步yield()在例10-1和例10-2中,我们都使用到了Thread类的静态方法sleep(),该方法能够将线程的执行暂停一段固定的时间,将CPU让给比当前线程优先级更低的线程。对sleep()的调用可能抛出InterruptedException异常,因为异常不能跨线程传播,因此必须在run()方法中加以捕获。5.加入一个线程join()一个线程可以在另一个线程上调用join()方法。如果当前线程在另一个线程t上调用t.join(),那么当前线

6、程将会被挂起,直到目标线程t结束(即t.isAlive()返回值为false)时才恢复运行。也可向join()加入一个超时参数,如果目标线程t在这段时间内还没有结束,join()总是可以返回。例10-5TestJoin.java:线程join()示例。6.终止线程早期的Java版本提供stop()方法强行终止一个线程,该方法在终止线程时不释放线程获得的锁,因而容易导致线程不一致,故在现代Java中已经被废止。较为安全的方式是使用一个标志,并提供方法对标志进行操作,标志的值决定了是否终止某个任务。10.3资源共享与同步多线程机制允许我们在同一时刻做多件事情,假设这些事情之

7、间没有干涉,那么也不会有什么问题。但很多情况下,多个线程会共享一些资源或数据,当多个线程同时操作这一资源或数据时,线程运行顺序的不确定性会导致共享资源或数据的结果产生不确定性,共享数据的一致性可能被破坏。因此,在多线程机制中,必须考虑对线程进行同步,以防止此类不一致的情况发生。1.资源访问冲突在例10-6的AddAccount类中,我们定义了一个由多个线程共享操作的静态Account类型的成员变量account,在main()方法中,通过并发执行100个Task任务对account进行操作,每个任务的操作都会试图通过调用deposit

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
正文描述:

《Java实用程序设计(西电版)第10章Java线程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第10章Java线程10.1并发的基本思想10.2Java的基本线程机制10.3资源共享与同步10.4线程状态与生命周期10.5多线程与I/O:管道流10.1并发的基本思想在深入多线程程序设计之前,读者需要了解并发的基本思想和动机。并发的第一个动机在一些操作系统原理书籍中经常被提及,即并发能够为单处理器上的程序提供性能的提升。表面上看,单处理器上运行并发程序引入了上下文切换的开销,似乎应比同样功能的顺序程序执行得慢。但在实际系统中存在阻塞的情况。也就是说,程序中的某个任务可能会被程序控制范围外的某些条件(如输入/输出)阻塞而不能继续执行。10.2Java的基本线程机制一

2、个线程是在进程中的一个单一的顺序执行流。每一个线程都能够驱动一个独立的子任务。CPU会为每个任务分配其占用CPU的时间,程序不需要知道CPU的数量及它所占用的CPU时间。Java的线程模型可以看做是CPU、代码和数据的封装体。线程模型的CPU可以看做是线程在占用CPU时CPU的状态;代码即CPU所执行的代码,可以由多个线程共享;数据包括线程独有数据(程序计数器、栈)和共享数据(如堆上的对象)。1.创建线程线程的创建通常可以通过两种方式完成:实现Runnable接口和继承Thread类。Runnable接口是java.lang包中定义的一个接口,该接口包含唯一的抽象方法r

3、un()。Thread类则是创建线程的基础类。Thread类的构造方法可以传入三类参数:ThreadGroup类型的参数指明新线程所处的线程组;String类型的参数指明新线程的名称;Runnable接口类型的参数所指向的对象类型决定了线程的具体行为。当通过实现Runnable接口来创建线程时,要完成以下 工作:(1)定义一个类,该类实现Runnable接口,即在该类中提供run()方法的具体实现;(2)将该类的一个实例对象(可称为任务)传递给Thread类的构造方法构造线程对象。当通过继承Thread类的方法创建线程时,应通过以下两步:(1)从Thread类派生出子类

4、,并通过重写子类的run()方法提供线程体;(2)通过创建子类的对象创建线程。2.ExecutorExecutor是J2SE5.0中引入的执行器接口,它存在于java.util.concurrent包中。Executor可以帮助用户管理线程对象,从而简化编程开发。Executor将主线程与所有任务线程分隔开,能够帮助主线程管理异步任务的执行,主线程不再需要显式地管理任务线程的生命周期。与传统的线程创建方法相比,Executor是一种更优的方式。3.线程优先级线程的优先级将该线程的重要性传递给调度器。虽然CPU处理现有线程集合的顺序是不确定的,但调度器会倾向于让优先级

5、较高的线程先执行。这并不代表优先级较低的线程将得不到执行,但是优先级较低的线程的执行频率会比较低。4.睡眠sleep()与让步yield()在例10-1和例10-2中,我们都使用到了Thread类的静态方法sleep(),该方法能够将线程的执行暂停一段固定的时间,将CPU让给比当前线程优先级更低的线程。对sleep()的调用可能抛出InterruptedException异常,因为异常不能跨线程传播,因此必须在run()方法中加以捕获。5.加入一个线程join()一个线程可以在另一个线程上调用join()方法。如果当前线程在另一个线程t上调用t.join(),那么当前线

6、程将会被挂起,直到目标线程t结束(即t.isAlive()返回值为false)时才恢复运行。也可向join()加入一个超时参数,如果目标线程t在这段时间内还没有结束,join()总是可以返回。例10-5TestJoin.java:线程join()示例。6.终止线程早期的Java版本提供stop()方法强行终止一个线程,该方法在终止线程时不释放线程获得的锁,因而容易导致线程不一致,故在现代Java中已经被废止。较为安全的方式是使用一个标志,并提供方法对标志进行操作,标志的值决定了是否终止某个任务。10.3资源共享与同步多线程机制允许我们在同一时刻做多件事情,假设这些事情之

7、间没有干涉,那么也不会有什么问题。但很多情况下,多个线程会共享一些资源或数据,当多个线程同时操作这一资源或数据时,线程运行顺序的不确定性会导致共享资源或数据的结果产生不确定性,共享数据的一致性可能被破坏。因此,在多线程机制中,必须考虑对线程进行同步,以防止此类不一致的情况发生。1.资源访问冲突在例10-6的AddAccount类中,我们定义了一个由多个线程共享操作的静态Account类型的成员变量account,在main()方法中,通过并发执行100个Task任务对account进行操作,每个任务的操作都会试图通过调用deposit

显示全部收起
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭