




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 多线程,本次课程内容,认识多线程 线程概念 创建多线程 线程的“一生” 线程的优先级 线程的同步,1. 认识多线程,当我们使用电脑时,可以一边听音乐、一边QQ聊天、一边打游戏。一个CPU怎么可以同时作这么多事情呢?,难道电脑真的可以同时运行多个程序?,真的吗?,在同一时间点执行各项进程,编译程序 发送/接收邮件 打印文件 其他,操作系统允许计算机同时执行多项操作,程序 (进程),public class mainClass public static void main(String agrs) m1(); public static void m1() m2(); m3(); public static void m2() public static void m3() ,单线程,双线程,2. 线程概念,程序、进程与多任务 程序(program)是对数据描述与操作的代码的集合,是应用程序执行的脚本。 进程(process)是程序的一次执行过程,是系统运行程序的基本单位。程序是静态的,进程是动态的。系统运行一个程序即是一个进程从创建、运行到消亡的过程。 多任务(multi task)在一个系统中可以同时运行多个程序,即有多个独立运行的任务,每个任务对应一个进程。,线程 线程(thread)就是比进程更小的运行单位,是程序中单个顺序的流控制。一个进程中可以包含多个线程。 简单来讲,线程是一个独立的执行流,是进程内部的一个独立执行单元,相当于一个子程序。,3. 创建多线程,JDK提供的相关类和接口 (1)Runnable 接口 就提供一个方法run() (2)Thread类 实现了Runnable接口 创建线程的两种方法: 创建Thread类的子类,重写该类的run方法 创建Runnable接口的实现类,实现接口中的run方法,方法一:创建Thread的子类,创建Thread的子类 创建线程对象 启动线程 start()方法可以启动线程,开始执行run()中代码。即:run()内代码,不是调用执行,而是启动后,由虚拟机自动执行的。,class MyThread extends Thread public void run( ) for(int i=1;i=30;i+) System.out.println(“线程”+getName()+“正在打印“+i); public static void main(String args) System.out.println(“main开始执行”); MyThread mt = new MyThread(); /MyThread mt2 = new MyThread(); mt.start( ); /mt2.start( ); for(int i =1;i=30;i+) System.out.println(“线程main正在打印“+i); ,线程练习一:管道流(PipedOuputStream,PipeInputStream),方法一: PipedInputStream in = new PipedInputStream(); PipedOutputStream out = new PipedOutputStream(in); 方法二: PipedInputStream in = new PipedInputStream(); PipedOutputStream out = new PipedOutputStream(); In.connect(out); out.connect(in),?问题: 要定义的线程类已经显式继承了一个其他的类怎么办?,方法二:创建Runnable接口的实现类,创建类实现接口 class classname implements Runnable void run() 创建该类对象(不是线程对象,还要借助Thread类) Thread(该类对象) 启动线程 start(),class MyRunnable implements Runnable public void run( ) for(int i=1;i=30;i+) System.out.println(“线程”+ Thread.currentThread( ).getName( )+“正在打印“+i); public static void main(String args) System.out.println(“main开始执行”); MyRunnable mr = new MyRunnable(); Thread t = new Thread(mr); t.start( ); for(int i =1;i=30;i+) System.out.println(“线程main正在打印“+i); ,run不可以调用! start启动线程! JVM自动执行run!,class MyRunnable implements Runnable public void run( ) for(int i=1;i=30;i+) System.out.println(“线程”+ Thread.currentThread( ).getName( )+“正在打印“+i); public static void main(String args) System.out.println(“main开始执行”); MyRunnable mr = new MyRunnable(); Thread t = new Thread(mr); t.run( ); for(int i =1;i=30;i+) System.out.println(“线程main正在打印“+i); ,4. 线程的“一生”,线程的“一生”有几个阶段: (1)创建 线程对象生成 (2)就绪 start()启动,等待运行 (3)运行 CPU运行run()代码 (4)阻塞 运行过程中因为某种原因,让出CPU (5)死亡 运行完毕,线程结束;或抛出异常退出,造成“阻塞”的原因: (1)yield() 主动出让CPU (2)sleep() 累了,休息一下 (3)join() 合并线程,暂停 (4)I/O操作 进行数据输出,暂停代码运行 结束阻塞 (1)休眠结束 (2)join()执行完 (3)输入/出操作执行完 (4)调用Interrupt()打断休眠,Thread类提供了获取和设置线程优先级的方法 getPriority:获取当前线程的优先级 setPriority:设置当前线程的优先级 Java语言为线程类设置了10个优先级,分别使用110内的整数表示 ,整数值越大代表优先级越高。每个线程都有一个默认的优先级,主线程的默认优先级是5。 Thread类定义的三个常量分别代表了几个常用的优先级: MAX_PRIORITY::代表了最高优先级10 MIN_PRIORITY::代表了最低优先级1 NORM_PRIORITY::代表了正常优先级5,5. 线程的优先级,class MyThread extends Thread public void run( ) for(int i=1;i=30;i+) System.out.println(“线程”+ Thread.currentThread( ).getName( )+“正在打印“+i); class ThreadTest public static void main(String args) System.out.println(Thread.currentThread().getPriority(); MyThread mt1 = new MyThread(); MyThread mt2 = new MyThread(); MyThread mt3 = new MyThread(); mt1.setPriority(MIN_PRIORITY); mt3.setPriority(MAX_PRIORITY); mt1.start();mt2.start();mt3.start(); ,线程间 “共享”数据产生的问题 实例: 银行的一个账户 : Bank bank = new Bank(“0001”,2000); 两张卡(线程) : Operation(“1#”,bank,1200).start(); Operation(“2#”,bank,1200).start();,6. 线程的同步,“0001” 2000,产生这种问题的原因是对共享资源访问的不完整。为了解决这种问题,需要寻找一种机制来保证对共享数据操作的完整性,这种完整性称为共享数据操作的同步。 在Java语言中,引入了“对象互斥锁”的概念。 “对象互斥锁”阻止多个线程同时访问同一个变量。 在Java语言中,“对象互斥锁”的实现: 用关键字synchronized来声明一个操作共享数据的方法或一段代码。,Java对象锁,用synchronized来标识的代码段或方法即为“对象互斥锁”锁住的部分。如果一个程序内有两个或以上的方法使用synchronized标志,则它们在同一个“对象互斥锁”管理之下。,使用“synchronized”关键字-1 修饰方法 被“syn
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 琵琶行集体备课课件
- 琵琶行并序课件
- 服装扶贫工程方案范文(3篇)
- 扶贫希望工程方案(3篇)
- 洞库工程临时伪装方案(3篇)
- 电梯工程的安装方案(3篇)
- 农业电商新业态:2025年乡村特色农产品直播基地风险管理报告
- 广西灵山县大步江水闸除险加固工程环评报告
- 玲玲的画课件
- 风机更换工程方案(3篇)
- 离子反应(优秀课件)
- 实变函数课件讲义
- DB15T 2416-2021蒙餐 风干羊背子
- 弹簧设计基础知识概要课件
- 中国文化概论 第1章 中国文化的历史地理环境课件
- 危险源登记检查及记录表
- 科研诚信课件
- 汽车维修常用工量具使用ppt课件(完整版)
- 1.1地球和地球仪-2022-2023学年新人教版地理七年级上册一课一练(Word版含答案)
- 产褥期保健PPTPPT课件
- 代理记账电话销售技巧PPT课件
评论
0/150
提交评论