计算机课件 多线程_第1页
计算机课件 多线程_第2页
计算机课件 多线程_第3页
计算机课件 多线程_第4页
计算机课件 多线程_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

妻附:多线程

主讲:李虹

M主要内容

JAVA^

■Case:Clock,java

■Case:AnimatorApplet.java

■多线程

■1、概念

■2、实现多线程的两种编程方法

■继承Thread类

■实现Runnable接口

■3、线程的状态转换及线程的控制操作

■4、线程间的同步与互斥

■作业:利用多线程实现动画设计。

多媒体与多线程开始|返回11上一页11下一页।2

嬴工、什么是多线程

■在JVM上执行的一个Java程序,是操作系统

中的一个遗看。同一个Java程序中的各个并发

执行的代码片断,是操作系统中的线程。

■每个线程均设计成具有部分程序功能,并且

能与其他线程并发执行。这种能力称为多线程

(multithreading)。

多媒体与多线程开始返回।上一页11下一页3

JAVA------------------------------------------------------

■多线程的实现:

■Java提供了Thread类来实现多线程。在

Java中)线程可以认为是由三部分组成的:

■(1)虚拟CPU,哇寸装在java.lang.Thread类中,

它控制着整个线程的运行;

■(2)执行的代码,传递给Thread类,由

Thread类控制顺序执行;

■(3)处理的数据,传递给Thread类,是在代

码执行过程中所要处理的数据。

多媒体与多线程开始返回I上一页11下一页4

盒2、线程创建的两种方法

■方法之一:继承Thread类

■1)Thread类的构造方法:

■publicThread(ThreadGroupgroup,

Runnabletarget,Stringname)

■group指明了线程所属的线程组;target是线

程体run()方法所在的对象;name是线程的名

称。target必须实现接口Runnable。展接口

Runnable中只定义了一个方法voidrun()作

为线程体。任何实现接口Runnable的对象都

可以作为一个线程的目标对象。

多媒体与多线程开始返回I上一页11下一页5

JAVA------------------------------------------------------

■Java对Runnable接口的定义如下:

■publicinterfaceRunnable{

publicabstractvoidrun();

■}

■类Thread本身也实现了接口Runnable,因此,上

述构造方法中各参数都可以为null,当上述构造方法

的某个参数为null时,我们可得到下面的几个构造方

法:

■publicThread()

■publicThread(Stringname)

■publicThread(Runnabletarget)

■publicThread(Runnabletarget,Stringname)

多媒体与多线程开始返回I上一页I|下一页6

■2)Thread类有许多方法,在此先给出其中几

个常用方法,并进行说明。

■StaticnativeThreadcurrentThreadQ:返回线

程对象的一个引用,它控制当前执行的线程。在任

何地方利用这个方法都可获当前是哪一个线程在运

行。

■finalStringgetNameQ:以字符串形式返回线程

的名称。

■finalintgetPriorityO^返回线程的优先级。

■voidstart。:启动线程对象

■voidsleep(longmillis):使线程暂时休眠millis

毫秒,让低优先级的线程暂时获取处理器资源。

多媒体与多线程开始返回I上一页I|下一页7

JAVA------------------------------------------------------

■voidrun():对线程来说run方法的功能等同于

程序中的main方法的作用。Thread类本身只是线

程的虚拟CPU,线程所执行的代码(或者说线程所

要完成的功能)是通过run方法(包含在一个特定

的对象中)来完成的,方法run。称为线程体。实

现线程体的特定对象是在初始化线程时传递给线程

的。在一个装程版建立并初始化以后,Java的运行

后系统就自动调用run方法,正是通过run方京才使

得建立线程的目的得以实现。run方法的结束即意

谏着线程的结束。通常,run方法是一个循环,例

如上一节中,一个播放动画的线程要循环显示一系

列图片。

多媒体与多线程开始返回।上一页11下一页8

JAVA------------------------------------------------------

■如何编程呢?步骤如下:

■(1)创建一个类扩展Thread类;

■(2)重写Thread类的run()方法,在此方法中

填写要在这个线程中要执行的代码;

■(3)用关键字new创建所定义的线程类的一个

对象;

■(4)调用该线程对象的start。方法启动线程。

多媒体与多线程开始返回上一页下一页9

Casel:创建两个线程,每一个都打印1到

氤词的数______________

publicclassMyThreadextendsThread〃从Thread类继承

<publicMyThread。〃默认构造方法

<super();}

publicMyThread(Stringname)〃构造方法

{super(name);}

publicvoidrun()〃并发执行的程序代码

<

for(inti=l;i<=5;i++)

<System.out.printlnC'"+1+"n+getNameO);

〃输出当前数字及线程名

try{sleep(lOOO);

//休眠工秒,给其它线程运行的机会

}catch(InterruptedExceptione){}

}

}-----------------____________

多媒体与多线程开始返回I上一页II下一页I10

JAVA-------------------------------------------------------

publicstaticvoidmain(String[]args)

<〃创建线程工的对象及线程2的对象

MyThreadmyThreadl=newMyThread(“线程工”);

MyThreadmyThreadZ=newMyThread(“线程2");

〃启动两个线程

myThreadl.start();

myThread2.start();

}

}

多媒体与多线程开始返回I上一页I|下一页U

JAVA------------------------------------------------------

■方法之二:继承Runnable接口

■编程步骤如下:

■自定义类实现Runnable接口

■定义方法run()

■使用Thread类的另一构造函数:

■Thread(RunnablezString)

用实现了Runnable接口的类的对象中所定义的

run()方法,来覆盖新创建的线程对象的run()方

■使用start。启动线程

多媒体与多线程开始返回I上一页11下一页12

笋Case2:用Runnable接口实现caseL

J^iibllcclassMyThreadiinplenrentsRunnable〃实现

Runnable接口

<publicMyThreadQ〃默认构造方法

{super();}

publicvoidrun()〃并发执行的程序代码

{

for(inti=l;i<=5;i++)

<System.out.println(",,+i+"

,,+Thread.CurrentThread().getName());

〃输出当前数字及线程名

try{sleep(lOOO);

//休眠工秒,给其它线程运行的机会

}catch(InterruptedExceptione){}

}

}_________________

、多媒体与多线程।开始।।..11上一页|I下一■|]

JAVA-----------------------------------------------------

publicstaticvoidmain(String[]args)

{〃创建线程1的对象及线程2的对象

ThreadmyThreadl=newThread(new

MyThread。,“线程1");

ThreadmyThreadZ=newThread(new

MyThread。,“线程2");

〃启动两个线程

myThreadl.start();

myThread2.start();

}

}

多媒体与多线程।开始]I返回11上一页11下一页

JAVA-------------------------------------------------------

■两种方法的选择

■当需要从其他类(如JApplet类)继承时,使用

java.lang.Runnable#口

■当编写简单的程序时,可考虑使用继承

java.Iang.ThreadM

■程序分析

■Car.java

■Candle.java

多媒体与多线程开始返回上一页下一页15

鎏3、线程的状态转换及线程的操作

JAVA----------------------------------------------------------

线程有四个状态:

创建、可运行、不可运行、死亡。

仓J建)犬态(newThread)

执行下列语句时,线程就处于创建状态:

ThreadmyThread=newMyThreadClass();

当一个线程处于创建状态时,它仅仅是一个空的线程对象,

系统不为它分配资源。

■2.运彳亍以夫态(Runnable)

ThreadmyThread=newMyThreadClass();

myThread.start();

当一个线程处于可运行状态时,系统为这个线程分配了它

需的系统资源,安排其运行并调用线程运行方法,这样就使得

该线程处于可运行(Runnable)状态。需要注意的是这一状态

并不是运行中状态(Running),因为线程也许实际上并未真

正运行。由于很多计算机都是单处理器的,所以要在同一时刻

运行所有的处于可运行状态的线程是不可能的,Java的运行系

统必须实现调度来保证这些线程共享处理器。

多媒体与多线程开始返回I上一页I|下一页17

JAVA------------------------------------------------------

■3.不可运彳亍》尖态(NotRunnable)

进入不可运行状态的原因有如下几条:

1)调用了sfee。()方法'

2)调用了suspend()方法;

3)为等候一个条件变量,线程调用wait()方法;

4)输入输出流中发生线程阻塞;

不可运行状态也称为阻塞状态(Blocked)。因为某种原因

(输入/输出、等待消息或其它阻塞情况),系统不能执行线程

的状态。这时即使处理器空闲,也不能执行该线程。

■4.死亡》失态(Dead)

线程的终止一般可通过两种方法实现:自然撤消(线程执行

X)或是被停止(调用stopQ方法)。目前不推荐通过调用

stop。来终止线程的执行,而是让线程执行完。

多媒体与多线程开始返回I上一页I|下一页18

嬴4、线程间的同步与互斥

-1)线程间的资源互斥共享

■通常,一些同时运行的线程需要共享数据。如

果线程只是读取这个共享的数据,则不必阻止

多个线程同时访问该数据。但是,在多个线程

共享同一个对象,并且一个或多个线程会修改

该对象时,每个线程就必须要考虑其它与它一

起共享数据的线程的状态与行为,否则的话就

不能保证共享数据的一致性,从而也就不能保

证程序的正确性。这个共享的数据区就是一个

临界区。首先观察下面例题所出现的问题。

多媒体与多线程开始返回I上一页II下I页19

JAVA----------------------------------------------------------

■Case3:模拟打电话程序,一个电话接听者

类通过线程实现若干打电话者。

CAG:\lh\lh\tool\JCREAI'2\GI200L"e-laixi

他说

二开

~大^

他说

^您

T关^

T

^

他说

^吗

1T1大

L日

同^X-

4、?

■、?

、I

T・

~

V

多媒体与多线程开始返回上一页下一页20

JAVA------------------------------------------------------

■在Java语言中,引入了“对象互斥锁”的概念(又

称为监视器、管程)来实现不同线程对共享数据操作的

同步。这个标记用来保证在任一时刻,只能有一个线程

访问该对象。即,“对象互斥锁”阻止多个线程同时访

问同一共享资源。

■在Java语言中,有两种方法可以实现“对象互斥

锁”:

-(工)用关键字volatile来声明一个共享数据(变量);

■(2)用关键字synchronized来声明一个操作共享数据

的方法或一段代码。

■一般情况下,都使用synchronized关键字在方法的

层次上实现对共享资源操作的同步,很少使用volatile

关键字声明共享变量。

多媒体与多线程开始返回।上一页11下一页

■对象锁机制

格式1:

synchronized(临界区对象)

'〃访问临界区对象的“关键”代码片断,又称同步代码

格式2:同步化方法。在方法的前面力口上synchronized。如:

publicsynchronizedvoidadd(){............}

对于实例方法,这种格式其实是如下的第一种格式的简化写

法:

publicvoidadd()

synchronized(this)

{............}

}

多媒体与多线程开始返回上一页下一页22

JAVA------------------------------------------------------

■Case4:引入互斥锁机制修改case3(模拟

打电话程序,一个电话接听者类通过线程实

现若干打电话者。)

贯G:UhUh\tool\KBKAr2\GE2001.exeJnixi

在磐

来的电话,他说:本周二开会?,我在和他交谈・・・

^老

上1

i木的电话,他说:祝您新年快乐?,我在和他交谈.

m电话?

i来

兀的电话,

温馨提示

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

评论

0/150

提交评论