版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第五章,线程与多线程,线程相关概念,程序是一段静态的代码,它是应用软件执行的蓝本。 进程是程序的一次动态执行过程,它对应从代码加载、执行到执行完毕的一个完整过程。 线程是比进程更小的执行单位。一个进程在其执行过程中,可以产生多个独立运行的子任务,形成多条执行线索,每个子任务都叫一个线程。线程可以由操作系统内核控制,也可以由用户程序控制。 一个进程中可以包含多个线程,每个进程至少包含一个线程,所以会自动创建一个线程,这个线程通常称为主线程。,线程和多线程,线程是一个相当小的对象,它不会占用大量内存而且可以快速创建。因此,一个应用程序可以使用多个线程执行不同的任务。 与进程不同的是,同类多线程共享
2、同一块内存空间和一组系统资源,所以,系统创建多线程花费单价较小。因此,也称线程为轻负荷进程。每个线程分配有限的时间片来处理任务。由于CPU在各个线程之间的切换速度非常快,用户感觉不到,从而认为并行运行。 多线程和传统的单线程在设计上最大的区别在于:由于各个线程的控制流彼此独立,使得各线程之间代码执行的顺序不确定,由此带来线程调度、同步等问题。,线程的创建,方法1:通过编写Thread类的子类实现多线程。 方法2:如果已经继承其他类,可以通过定义一个实现Runnable接口的类实现多线程。,方法1,步骤如下: 从Thread类派生一个类,覆盖Thread类中的run方法。例如: public c
3、lass T extends Thread public run() /需要以线程方式运行的代码 创建该派生类的对象。例如: T newThread = new T(); 调用start方法启动该线程。例如: newThread.start();,class subThread1 extends Thread/线程1 public void run()/重写run()方法,输出126 for(int i=1;i=26;i+) System.out.println(i); sleep(100); ,public static void main(String args) new subThrea
4、d1(1).start(); ,方法2,步骤如下: 定义一个类,实现Runnable接口。例如: public class T implements Runnable public void run() /线程体 创建自定义类的对象。例如: T target = new T(); 创建Thread类对象,指定该类的对象作target参数。 Thread newthread = new Thread(target); 启动线程。例如: newthread.start();,使用Runnable接口示例,创建一个程序实现当前时间显示,要求每2秒显示1次,显示20次后程序退出。 分析:在Java的j
5、ava.util包中有一个Date类,可以通过实例化一个Date对象得到当前时间。要求每两秒显示一次时间,线程是完成这个任务最好的工具。通过每两秒唤醒线程一次,并且就在这一瞬间显示出时间。还需设置一个循环控制输出次数。 程序如下所示:,public class ThreadDemo implements Runnable private Date nowtime; public void run() while(true) nowtime = new Date(); System.out.println(nowtime); clock.sleep(2000); public static vo
6、id main(String args) ThreadDemo t = new ThreadDemo(); Thread time=new Thread(t);t.start(); ,线程的状态和生命周期,每个Java程序都有一个缺省的主线程。对于Java应用程序,主线程是main方法执行的指令序列;要想实现多线程,必须创建新的线程对象。 Java语言使用Thread类及其子类的对象来表示线程,新建的线程在它的一个完整的生命周期中通常包括新建、可运行、阻塞和死亡四种状态。,线程的生存周期状态图,线程生命周期状态图,返回,线程的几种状态,新建(New)状态:线程在产生时便进入新建状态。即new
7、Thread()创建对象时,线程所处的便是这个状态,但此时系统并不会分配资源,直到用start()方法激活线程时才会分配。 可运行(Runnable)状态:处于新建状态的线程被启动(调用start方法)后,进入Runnable状态。Runnable状态可分为就绪和运行两种状态,但从程序设计的角度来看,可以认为它们是同一种状态。,阻塞(Not Running)状态:当发生下列事件之一时,线程就进入阻塞状态。 该线程本身调用sleep()方法。sleep(long millis)可用来设置睡眠的时间。 线程调用对象的wait()方法; 该线程调用了suspend()方法; 输入输出流中发生线程阻塞
8、; 当线程被阻塞后,便停止run()方法的运行,直到被阻塞的原因不存在后,线程回到可运行状态,继续排队争取CPU的资源。,对于上面四种阻塞情况,都有可以返回可运行状态的方法与之对应。 线程进入睡眠状态,但指定的睡眠时间到了。 如果线程是由调用对象的wait()方法所阻塞,则该对象的notify()方法被调用时可解除阻塞。notify()方法用来“通知”被wait()阻塞的线程开始运行。 如果线程是由调用suspend()方法所阻塞,只能由其它线程调用它的resume()方法恢复 输入输出流中发生线程阻塞;,死亡状态:处于死亡状态的线程不具有继续运行的能力。线程死亡的原因有两个:一个是正常运行的
9、线程完成它的全部工作后退出;另一个则是线程被强制性地终止,如通过执行stop方法或destroy来终止线程。此时,线程对象可以由JVM进行垃圾收集。 利用上述方法可以完成线程间的通信以及线程状态之间的转换,下面举例说明通过wait()、notify()来达到线程间的通信和状态的转换。,状态图,线程间通信的示例:本例模拟两个银行之间的转帐业务,当A银行转帐给B银行后,暂停转帐,通知B银行转帐给A银行,转帐金额随机确定。,public static final int MAX_PRIORITY: 最大优先级,值是10。 public static final int MIN_PRIORITY: 最
10、小优先级,值是1。 public static final int NORM_PRIORITY:缺省优先级,值是5。,线程类Thread常用的常量,Thread 类中的常用方法,多线程同步,透支,多线程同步示例,class Countmoney private static int sum=0; public static void add(int n) int t = sum; t = t + n; try Thread.sleep(int)(1000*Math.random(); catch(InterruptedException e) sum = t; System.out.print
11、ln(sum=+sum); class Cperson extends Thread public void run() for(int i = 1;i=3;i+) Countmoney.add(100); ,public class MoneyDemo public static void main(String args) Cperson c1 = new Cperson(); Cperson c2 = new Cperson(); c1.start(); c2.start(); ,运行结果: sum=100 sum=200 sum=300 sum=100 sum=200 sum=300,
12、同一进程的多个线程共享同一存储空间,带来了访问冲突这个严重的问题。例如,两个线程访问同一个对象,一个线程向对象中存储数据,另一个线程读取该数据。如果第一个线程还没有完成存储操作第二个线程就开始读数据,就产生了混乱。因此,必须采用同步机制来防止类似情况发生,即在第一个线程完成存储操作之前,禁止其他线程访问该对象。,同步的概念,为了解决这个问题,Java语言提供了同步机制来解决这种冲突,避免同一个数据对象被多个线程同时访问。 Java语言通过关键字synchronized实现同步。当对一个对象(含方法)使用synchronized,这个对象便被锁定或者说进入了监视器。在一个时刻只能有一个线程可以访
13、问被锁定的对象。它访问结束时,让高优先级并处于就绪状态的线程,继续访问被锁定的对象,从而实现资源同步。,同步机制,关键字synchronized用于声明在任何时候都只能有一个线程可以执行一段代码或一个方法。 synchronized有两种用法:synchronized方法(锁定冲突的方法)和synchronized块(锁定冲突的对象)。 通过在方法声明中加入synchronized关键字来声明同步方法。如: synchronized 当一个线程调用一个“互斥”方法时,它试图获得该方法锁。如果方法未锁定,则获得使用权,以独占方式运行方法体,运行完释放该方法的锁。如果方法被锁定,则该线程必须等待,直到方法锁被释放时。,wait-notify 机制,为避免轮流检测,Java提供了一个精心设计的线程间通信机制,使用wait()、notify()和notifyAll()方法 。 这三个方法必须在已经持有锁的情况下执行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025中建一局集团第二建筑有限公司职业经理人(副总经理)1人笔试历年参考题库附带答案详解
- 2025中国能建国际集团春季社招36人笔试历年参考题库附带答案详解
- 2026版《金版教程》高考一轮复习政治必修3 第三单元 第九课 全面推进依法治国的基本要求
- 演艺企业法律法规及经营规范岗前培训试题及答案
- 2026年信访档案登记管理试题及答案
- 2026中国科学院南海海洋研究所海洋环流动力学学科组科研助理招聘1人笔试参考试题及答案详解
- 2026年鞍山市立山区事业编单位人员招聘笔试备考题库及答案详解
- 细胞外囊泡在组织再生中的递送系统优化
- 2026年乌海市海勃湾区中小学编制教师招聘笔试模拟试题及答案详解
- 2026年湖州市市级医院公开引进博士研究生12人笔试参考题库及答案详解
- 画法几何及土木工程制图课件
- 江苏省苏州相城区苏州大学实验学校2023-2024学年小升初七年级上学期分班考英语试卷(含答案)
- 机械设备的润滑课件
- SL703-2015灌溉与排水工程施工质量评定表
- 二升三暑期奥数培优(学生教材)
- 门式启闭机主梁下主梁1工艺设计卡
- 人教版四年级下册数学期末测试卷(模拟题)
- 航理ppt课件 7-1概述及航空活塞动力装置-1
- 人教版数学必修一课后习题答案
- YS/T 1018-2015铼粒
- GB/T 18342-2009链条炉排锅炉用煤技术条件
评论
0/150
提交评论