Java程序设计教程(第三版)课件 项目十 多线程_第1页
Java程序设计教程(第三版)课件 项目十 多线程_第2页
Java程序设计教程(第三版)课件 项目十 多线程_第3页
Java程序设计教程(第三版)课件 项目十 多线程_第4页
Java程序设计教程(第三版)课件 项目十 多线程_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目十多线程

【项目描述】

在Java中,实现多线程有两种方法,本项目介绍了两种不同的方法实现多线程。在多个线程对同一共享资源进行写操作时可能会引发错误,本项目还演示了使用线程的同步操作来避免这种错误。【任务分解】本项目可分解为以下三个任务:用Thread类实现多线程。用Runnable接口实现多线程。线程的同步与死锁。任务一用Thread类实现多线程【任务描述】任务10-1:利用Thread类实现多线程。模拟两个线程同时数鸭子的过程。【必备知识】1.多线程的概念线程是指可以独立并发执行的程序单元。而多线程是指程序中同时存在的多个执行体,它们按照自己的执行路线并发工作,独立完成各自的功能,互不干扰。2.线程的生命周期线程的生命周期有5个状态:新生状态:对象初始化后就进入新生状态,为其分配内存空间。就绪状态:通过start()方法进入就绪状态,进入线程队列,等待CPU。运行状态:运行自己的run()方法,直到调用其他方法、完成任务、资源阻塞等终止。阻塞状态:就是在运行状态由于资源得不到满足让出CPU,进入阻塞状态。消亡状态:两种情况进入消亡状态。1)正常运行的线程完成了它的工作内容。2)被强制终止,如:调用stop()或destroy()方法。

阻塞解除阻塞事件

start()stop()或destory()调度选中

新生状态就绪状态运行状态阻塞状态消亡状态线程的生命周期3.实现多线程的两种方法

在Java中,创建线程的方法有两种:通过创建Thread类的子类来实现;通过实现Runnable接口的类来实现。

4.继承Thread类来实现多线程[格式10-1通过Thread类实现多线程]class类名extendsThread{

属性;//定义类的属性…

方法;//定义类的方法…publicvoidrun(){//重写Thread类的run()方法

线程主体;}}【解题思路】

任务10-1:1.首先创建一个Thread类的一个子类。2.在子类中实现run()方法。3.在main()方法中调用start()方法。重温任务:任务10-1:利用Thread类实现多线程。模拟两个线程同时数鸭子的过程。

【任务透析】packagecom;classShuYaZiThreadextendsThread{ privateStringname; publicShuYaZiThread(Stringname){ =name; } publicvoidrun(){ for(inti=0;i<=10;i++){ System.out.println(name+":第"+i+"只鸭子"); try{ Thread.sleep(500);

}catch(InterruptedExceptione){ e.printStackTrace();

}

} } }

publicclassThreadDemo10_1Test{ publicstaticvoidmain(String[]args){

ShuYaZiThreadmt1=newShuYaZiThread("王文轩");

ShuYaZiThreadmt2=newShuYaZiThread("孙桐桐");

mt1.start();

mt2.start();

}}本任务案例中,两个对象mt1和mt2分别调用了start()方法启动了两个线程。start()方法的调用并不是立即执行多线程代码,而是使得线程变为就状行态,什么时候运行是由操作系统调度的。

图10.2任务10-1的运行结果【课堂提问】进程和线程的区别是什么?线程的生命周期有哪几种状态,这几种状态间是如何转换的?启动多线程的应该调用什么方法?【现场演练】模仿任务10-1,利用Thread类实现多线程,模拟3个人同时派发招生简章的情形,假设每人要派发100份。任务二

用Runnable接口实现多线程【任务描述】任务10-2:利用Runnable接口实现多线程。模拟两个线程同时数鸭子的过程。【必备知识】1.利用接口Runnable来实现多线程

接口Runnable中的方法:通过Runnable接口实现多线程的语法格式如下:[格式10-2通过Runnable接口实现多线程]class类名implementsRunnable{

属性;//定义类的属性…

方法;//定义类的方法…publicvoidrun(){//重写Runnable接口中的run()方法

线程主体;}}线程的几个重要方法:sleep(longmillis):让一个线程进入休眠状态,即使程序的执行暂停一段指定的时间。单位为毫秒。setName(Stringname):设置线程名字。getName():返回线程的名字。currentThread():返回当前的线程,返回类型为Thread。isAlive():判断线程是否处在动行状态,如果是返回true,否则返回false。yield():将目前正在执行的线程暂停。【解题思路】

任务10-2:1.设计一个实现接口Runnable的类。2.重写线程的run()方法。3.创建一个该类的对象。4.以此对象为参数建立Thread类对象。5.Thread对象调用start()方法。

【任务透析】//任务10-2源程序:ThreadDemo10_2Test.javapackagecom;classShuYaZiThreadimplementsRunnable{privateStringname;publicShuYaZiThread(Stringname){=name; }

publicvoidrun(){for(inti=0;i<=10;i++){System.out.println(name+":第"+i+"只鸭子");try{ Thread.sleep(500);}catch(InterruptedExceptione){e.printStackTrace();}} }}publicclassThreadDemo10_2Test{publicstaticvoidmain(String[]args){ShuYaZiThreadmt1=newShuYaZiThread("王文轩");ShuYaZiThreadmt2=newShuYaZiThread("孙桐桐");Threadt1=newThread(mt1);Threadt2=newThread(mt2);t1.start();t2.start();

}}图10.3任务10-2的运行结果

本任务案例中,ShuYaZiThread类通过实现Runnable接口,使得该类有了多线程类的特征。run()方法是多线程的一个约定,所有的多线程代码都在run方法里面。不管是继承Thread类还是实现Runnable接口来实现多线程,启动多线程仍然是使用Thread类的start()方法,因此使用了Thread类的构造方法publicThread(Runnabletarget),接收了Runnable的子类实例对象。

【课堂提问】在Java中有几种实现多线程的方法?继承Thread类和实现Runnable接口的区别是什么?线程的主体方法是什么?

【现场演练】

模仿任务10-2,利用Runnable接口实现多线程,模拟3个人同时派发招生简章的情形,假设每人要派发100份。任务三

线程的同步与死锁【任务描述】任务10-3-1:某商家十周年店庆,免费赠送100份礼品,前100名申请的用户可获得赠品。假设没有限制每个账号索取的份数,并假定当前有4个用户正在同时申请赠品。本任务通过使用线程同步代码块来避免赠品出现负数的这种错误。任务10-3-2:多个线程对同一共享资源进行写操作时可能引发错误。本任务通过使用线程同步方法块来避免赠品出现负数的这种错误。【必备知识】1.多线程资源共享安全问题

多个线程同时操作一个对象,则此对象称为共享对象。如果要对共享对象进行写操作,那么在一个线程进行写操作的过程中,为保证结果的正确性,其他线程不能同时对共享资源进行操作的。2.线程的同步操作

线程的同步是保证多线程安全访问共享资源的一种手段,可使用同步代码块和同步方法来实现线程的同步操作。(1)同步代码块:[格式10-3同步代码块]{synchronized(同步对象)

需要同步的代码;}(2)同步方法:[格式10-4同步方法]

synchronized方法返回值

方法名(参数列表){

}

【解题思路】

任务10-3-1:1.创建申请赠品类GetGiftThread,申请赠品这个操作充许多个用户同时进行,该类要实现了多线程。2.当某个线程比较到100份赠品还没送完时(即gift>0),则可成功申请到赠品,并且赠品数要减1。3.把判断赠品是否为零和申请赠品、赠品数减1操作放到同步代码块中。4.创建主类,创建主方法,在主方法中定义进程对象,创建4个线程并启动。【任务透析】//任务10-3-1源代码:ThreadDemo10_3_1Test.javaclassGetGiftThreadimplementsRunnable{

private

intgift=100;

public

voidrun(){

for(inti=0;i<100;i++){synchronized(this){

if(gift>0){

try{

Thread.sleep(100);

}catch(InterruptedExceptione){

e.printStackTrace();

}

System.out.println("恭喜您成功申请到赠品!");

System.out.println("赠品还剩:"+(--gift)+"份");

}

} } }}

public

classThreadDemo10_3_1Test{

public

static

voidmain(String[]args){ GetGiftThreadgt=newGetGiftThread();//定义线程对象 Threadt1=newThread(gt); Threadt2=newThread(gt); Threadt3=newThread(gt); Threadt4=newThread(gt); t1.start();//启动线程 t2.start(); t3.start(); t4.start(); }}图10.5任务10-3-1ThreadDemo10_3_1Test的运行结果【解题思路】

任务10-3-2:

步骤3改为同步方法实现,其余步骤和任务10-3-1相同。

//任务10-3-2源代码:ThreadDemo10_3_2Test.javaclassGetGiftThreadimplementsRunnable{

private

intgift=100;

public

voidrun(){

for(inti=0;i<100;i++){this.apply();}}

publicsynchronizedvoidapply(){ if(gift>0){

try{ Thread.sleep(100); }catch(InterruptedExceptione){ e.printStackTrace(); } System.out.println("恭喜您成功申

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论