- 1、本文档共31页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
public synchronized void sale() { // synchronized method body } 需要避免的与多任务处理有关的特殊错误类型是死锁(deadlock)。死锁发生在当两个线程对一对同步对象有循环依赖关系时。例如,假定一个线程进入了对象X的管程而另一个线程进入了对象Y的管程。如果X的线程试图调用Y的同步方法,它将像预料的一样被锁定。而Y的线程同样希望调用X的一些同步方法,线程永远等待,因为为到达X,必须释放自己的Y的锁定以使第一个线程可以完成。死锁是很难调试 * 第八章 多线程 教学目的 掌握多线程程序的设计 掌握线程操作的常用方法 掌握synchronized关键字的使用,锁的概念,死锁的发生 教学内容 必须掌握的内容:Thread、Runnable,线程的启动; 必须掌握的内容:帮助文档中线程操作的常用方法 必须掌握的内容: synchronized,同步代码块,同步方法,同步对象 需要了解的内容:死锁的发生和预防 多任务处理 在多任务系统中,每个独立执行的程序称为进程,即“正在进行的程序” 实际上CPU在某一时刻只能做一件事,但操作系统对CPU进行调度,以非常小的时间间隔交替执行多个程序,就给人以同时完成多个任务的感觉 进程之间切换需要额外的开销 线程概念 一个进程中又可以包含多个线程,一个线程就是进程内部的一条执行线索 在单线程中,代码按调用顺序依次执行,当主函数调用了子函数,主函数必须等子函数返回后才能继续往下执行 基于线程的多任务处理 基于线程所需的开销更少 在多任务中,各个进程需要分配自己独立的地址空间 多个线程可共享相同的地址空间并且共同分享同一个进程 进程间调用、切换涉及的开销比线程间要多 线程与多线程 线程是指进程中单一顺序的执行流,又称为轻量级进程。线程共享相同的地址空间并共同构成一个大的进程。线程间的通讯非常简单而有效,上下文切换非常快并且是整个大程序的一部分切换。线程可以彼此独立执行,一个程序可以同时使用多个线程来完成不同的任务。一般用户在使用多线程并不考虑底层处理的详细细节。 多线程的应用事例 一个Web浏览器边下载数据边显示已到达的数据。这是因为有一个线程在执行下载数据并且通知另一个线程有更多数据已经到达,另一个线程则整理和显示已到达的信息。 主线程 Java线程是通过Thread类来控制的,一个Thread类对象代表一个线程 当Java程序启动运行时,就自动产生了一个线程,主函数main就是在这个线程上运行的,该线程通常称为程序的主线程 主线程的重要性体现在两个方面: 它是产生其他子线程的线程 通常它必须最后完成执行,因为它执行各种关闭动作 JAVA的线程类和Runnable接口 在Java语言中,可采用两种方式产生线程: 通过继承Thread类构造线程。Java定义了一个直接从根类Object中派生的Thread类。所有从这个类派生的子类或间接子类,均为线程。 实现一个Runnable接口。 Runnable接口 Java语言源码中,Runnable接口只包含了 一个抽象方法,其定义如下: public interface Runnable{ public abstract void run(); } Thread类 构造函数 Thread() Thread(String?name) Thread(Runnable?target) Thread(Runnable?target, String?name) …….. Thread类 静态常量:同线程优先级相关 MAX_PRIORITY :最高优先级 MIN_PRIORITY:最小优先级 NORM_PRIORITY :普通优先级 系统为新建线程指定优先级的原则: 将继承创建它的父线程的优先级。 一般情况,主线程的优先级为普通级。 Thread类 主要方法 void start() void run() static?void sleep(long?millis) static?void sleep(long?millis, int?nanos) static?Thread currentThread ?String getName() boolean isAlive() 实现多线程 JAVA程序中实现多线程有两个途径:创建 Thread 类的子类和实现Runnable接口。 通过继承Thread类 用户程序创建自己的Thread类的子类; 在子类中重新定义自己的run()方法,这个run()方法中包含了用户线程的操作。 然后,用户程序在需要建立自己的线程的时候,创建一个已定义
文档评论(0)