多线程教学课件_第1页
多线程教学课件_第2页
多线程教学课件_第3页
多线程教学课件_第4页
多线程教学课件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

Chapter14

多俵森

Javat要特槛之一在孑其闲置的多饯福

支持。多彼程;猾系疣同时运行多个执行体的

犍力。工.

14-1认识线程

多饯程是现代据作系疣有别于传疣搽作系

疡的厘要标志之一,它■别手传疣的多迹程的

概念。

一、俵程与进程;;、;;;

T"都是现实畀发他的一个基建单假Q区

同曲作名基多的就行单无,狡雀的刻合

,,国而支持多彼程的系疣要比只支持多

臻疣开发凌之。

1.进程杷砌蒋变间作,自己的资源之一,每

个进程物喳自己的冷落单完。

2.与之相反,饯福和共享向花单无,遍过共

享的向商室间束会换信息,从而有利于梃

富执竹致率。

3.饯程是80年代末才被真正引入的概念,它

衣梃离余疣吞吐事,有数利用系统资源,

改善用户值务之间的通讯致率。及发挥多

处理机硬件喉犍方面嗡用著的作用。

4.饯福在布啜怩的OS中得到了广达的应用,

现森对为饯程的支持已感,新一代糅作系

疣的童要标志之一。

5.WinNT,2000,Mach3.0,Solaris4皆立

持‘假福。1'111

二、饯程的执行马界发榴

多饯程的出发点是,梃裔余统的开发喉,使用

的行事机是单CPU的,弄农执行实际上从系疫内部

来看仍然是串行执行的,旦本过由于摇作条疣可“工

自劭地进行口务切换,所。送是一个假象。

例电:................................

两个界农执行的狡程A、B(市相同的优先

极),系统南部送两个饯程的㈱行顺序是;

ABABABABBBB

三、优先级和调度

森多俵程系统中,每个狡程都被赋予一个优先公,

它决定了筱程获得CPU被倜/执行的优先程度。优先

公裔的饯程可。点短时间段内获得更多的执行时间,

俵程的优先公电黑党交相等,粉被侬据“先来电服务”

的原则进行倜/。

Thread类有3个嗡关饯程的静态有量,

MIN_PRIORITY景小,通布,1

MAX_PRIORITY獴大,遹帝,10

NORM_PRIORITY,普遍优先秋,通帘,5

对新建的依移通存健豕其父类的优先秋。用户可

。iliisetPriority(intn)方法来修改系统自劭微用:的

俵程优先恐。

田、同步11111।1

Java的送行时环境中,板程是从相同的肉商宠

间许胎运行的,它们共享变量令方法的扬问权。

同步间敦:A、B板程共享第一对象

例电:A快孑B导致剧据名失或者不一致等冏题。

同步的基存思想是避免多个假程扬向同一资源。

Java是转面向对象的语言,它的资源都是△对去的

彬式表现的。

A写数据「对象—|读数据B

范例;单欲卷的操作

/Zapp14_1,单一彼程的范例

classCtest

,{।।।।।।।■

privateStringid;

publicCtest(Stringstr){〃构造晶懿,核置数据成员id

id=str;

I}lllllllll

publicvoidrun(){IIrun()方法

for(inti=0;i<4;i++){

for(intj=O;j<1OOOOOOOO;j++);〃变循环,用未枪慢12行运行的速度

System.out.println(id+"isrunning..");

1}...........................................................................................

')111111,111

}1.............................................................11

publicclassapp14_1

publicstaticvoidmain(Stringargs[])

(

Ctestdog=newCtestf^doggy");

Ctestcat=newCtest("kitty");

dog.run();

cat.run();

)

}

/*app14-1OUTPUT-------

doggyisrunning..

第23行用dog对象惆用run()方法

doggyisrunning..

doggyisrunning..

doggyisrunning..

kittyisrunning..

第24行用cat对象倜用run()方法

kittyisrunning..

kittyisrunning..

kittyisrunning..

--------------------------*/

激活俵程;;;;;;Dni一

⑴创建类Thread的3类,并和喇其run()方法。

Java.Iang.Thread类用于森多欲程应用程序构造和

妨问单个的多筱程。

饯程的定义语法

class类名称extendsThread〃乂Thread类犷屐由3类

(;;;;;;;;;;

类里的数据朗员.•・

类里的方法…।................................

修示符run(){〃覆基Thread类里的run()方法"处理

俵程里的隹本;

1}1111111111

范例2;多彼程的糅作

classCtestextendsThread//^Thread类扩展出3类Ctest

;{八u

privateStringid;

publicCtest(Stringstr){〃构造房照,殁置闽员id

id=str;

i}iiiiiiiii

publicvoidrun(){//<JLThread类里的run()方法

for(inti=0;i<4;i++){

for(intj=O;j<100000000;j++);//空循林,用束也慢12

行运行的速度

System.out.println(id+,'isrunning..'*);

);;i;;i;;;

i}iiiiiiiiii

}ii..................................................i

publicclassapp14_2

publicstaticvoidmain(Stringargs[])

{;;;;;;;i

Ctestdog=newCtest("doggy");

Ctestcat=newCtest("kitty");

dog.start();II灌意是start。,而系是run()

cat.start();II港意是start。,而木是run()

)

)।।।।।।।

/*app14_2OUTPUT------------------------

kittyisrunning..

doggyisruuning..

kittyisrunning..

kittyisrunning..

doggyisrunning..

kittyisrunning..

doggyisrunning..

doggyisrunning..

灌意应上面的程序代妈中,您本怩直接倜用

run()方法,送曲只是杷run()运行一遍而已,界没

有激活欲丑。正确的方式是调用由Thread类健示而

束的start。,喋后由这个方法森初刻表(scheduler)

中於录这个假程,景后送个假程用胎送竹时,run()

方法自勉会被倜用

情灌意,董超先碉用了dog.start(),森碉用

cat.start。,但在app14_2的输出中,“Mttyis

running./(^"doggyisrunning.."是会错出现的,

也就是说,这两个彼程是一越运行的。便哪一个生

符串先出现则系一定,全着碓抢到CPU的资源。

单一线程两个线程

app14_1.javaapp14_2.java

囹14」单一俵程于两个多俵程的比簌

14-2用Runnable接口来创建线程

applets扩展前Applet类,Java系艾持多童健

豕。因此不犍由Applet类勿Thread类源2Java提

供Runnable接口来解决这个问敢o

范例,用Runnable接口来创建夜程

IIapp14_3,用Runnable接口来创食残程

classCtestimplementsRunnableII由Runnable接口实现Ctest类

.......................................................................

privateStringid;

publicCtest(Stringstr){〃构造海数,微置感员id

id=str;

)

publicvoidrun(){IIrun()方法

for(inti=0;i<4;i++){

for(intj=0;j<100000000J++);II空循蹂,用来也慢12行运行的

速度।।।।।।

System.out.pnntln(id+"isrunning..");

)।।।।।।-J

))i।、i

}ilIII

publicclassapp14_3

{I:;;;;;;

publicstaticvoidmain(Stringargs[])

{11............................

Ctestdog=newCtest(ndoggyn);

Ctestcat=newCtest("kitty");

Threadt1=newThread(dog);II产2Thread类的对象tl

Threadt2=newThread(cat);IItThread类的对象t2

t1.start();II用t1激活彼程

t2.start();II用t2激活狡程

}.................Illi

........................IIIIiI

/*app14-3OUTPUT------

kittyisrunning..

doggyisrunning..

kittyisrunning..

kittyisrunning..

doggyisrunning..

kittyisrunning..

doggyisrunning..

doggyisrunning..

-------------------------*/

说明;Ctest是由Runnable接口实现而来的类。因Runnable接口

里声明嗡run()方法,因此苏领森Ctest类里定义它的处理方式才

行,事实上兄要也处理俵福的隹本代妈数森run()里就可。了o

14-3线程的管理

咨有多个狡丑同时运行,那么,管理送废程的工

作便显得更重要。帝盛夜程势须安排点盛西欲程牯束

之后才犍运行,市盛筱程则处须让它小睡片刻(sleep)

,或者是光智徭运行,再塔稗其他的狡程唉醵它。

14-3-1饯福的亡命周期

但何夜程再创建我消亡具市下列四个正态:

1.可创建的(newlycreated)

2,可运行的(runnable)

3.被潦信的(blocked)

4.消亡的(dead)

送四种技态物可逾逑Thread类所提供的方法来倜用,其关系

电囹14—2所市。

囹14—2俵程的液态转号与方法关系

创建的假福

咨我们用newThread。创建对象时,筱程所处

的便是这种技态,依此时系疣界系会配置资源,直

刊用start。方法激活孩程时才会配置。

可用竹的状态

由start。方法激活欲程时,欲程便进到可运行

的收态。此时景兑枪到CPU资源的彼程允许胎送行

run()方法,其余的饯程便点队列(queue)”稗机会

争取CPU的资源,一旦争取到便许胎运行。

被潦秸的状态

电干因素农2时,筱程被潦秸:

1、被孩程倜用对彖的wait。方法。

2、被饯程多身调用sleep。方法.

3、孩狡程令另一个饯程join。在一超时

问我;依程东可怩一直此孑狼潦秸的技态,那么,

什么时候这种狼潦秸的液态消失呢7

1.俵福执行notify。方彼.

2.狡程的猾笑的休眠时间到了.

漪亡的状态

咨饯程的run()方法运行辂束,或是由饯隹倜用

它的stop。方法时,则废丑进入源毁的枚态。

14-3-2假程的休眠

让筱丑休眠(进入潦住的波态),点被置的时间

为就会自劭盛来,由此便可我做彼程的运行。

Thread类里的sleep。方法可用来控制饯程的体

眠液态,休眠的时间去看sleep。里的参微而是,单

假亳秒

范例:

IIapp14_4,sleep()方法的示范

classCtestextendsThreadII^Thread类犷展出各类

{

privateStringid;

publicCtest(Stringstr){〃构造筛照,微盗裁员id

id=str;

}।।.............................................................।

publicvoidrun(){〃覆萋Thread类里的run()方法

for(inti=0;i<4;i++){

//sleep()方法处须写点try-catch块里

try(

sleep((int)(1000*Math.random()));

i}iiiiiiiiiii

catch(InterruptedExceptione){}

System.out.println(id+"isrunning./1);

1)1111..................................

});;;;;;;;;

publicclassapp14_4

{i®iriiiiiiii

publicstaticvoidmain(Stringargs[])

{>>'।>'''>

Ctestdog=newCtest(,'doggyn);

Ctestcat=newCtest("kitty");

dog.start();

cat.start();

)

)

/*app14-4OUTPUT

kittyisrunning.,

doggyisrunning.,

kittyisrunning.,

kittyisrunning.,

doggyisrunning.,

kittyisrunning.,

doggyisrunning.,

doggyisrunning..

------------------------*/

14-3-3等待假福

范例/激活假程

要求;在app14_5福格中苒加上一行输出

//app14_5,激活饯程的范例

II将app14_4的Ctest类黄于此处

publicclassapp14_5

l{11111111

publicstaticvoidmain(Stringargs[])

(

Ctestdog=newCtest("doggyH);

Ctestcat=newCtest("kittyH);

dog.start();II激活dog依程

cat.start();〃激活cat彼慈

System.out.println("main()methodfinished");

}11...........1

}

/*app14-5OUTPUT------

main()methodfinished

doggyisrunning..

kittyisrunning..

doggyisrunning..

doggyisrunning..

doggyisrunning..

kittyisrunning..

kittyisrunning..

kittyisrunning..

-----------------------_*/

冏敢:这一输出行,什么没嗡在秦后一行输出7

范例2:............................................

要求:对筱程进行排程,按顺序输出给条。

Z/app14_6,激活彼程的范例

II将app14_4的Ctest类置于此处

publicclassapp14_6

publicstaticvoidmain(Stringargs[])

(

Ctestdog=newCtest("doggyH);

Ctestcat=newCtest("kitty");先运行dog线程

dog.start();II激活dog俵程

try{

dog.join();II限制dog饯福秸集后才就徒下运行

)।।।।।Join()方法必须

catch(lnterruptedExceptione){}写在try-catch块里

cat.start();〃激活cat筱程

try{

catJoin。;〃限制cat彼程秸束后才犍植下运行Join()方法必须

写在块里

}try-catch

catch(lnterruptedExceptione){}

System.outprintln("main()methodfinished");

1}1,1,111

|}.........................................K+a

/*app14-6OUTPUT------

doggyisrunning..

先运行dog微程

doggyisrunning..

doggyisrunning..

doggyisrunning..

kittyisrunning..

常运行cat彼程

kittyisrunning..

kittyisrunning..

kittyisrunning..

赛后再执行i筱程

main()methodfinished

---------------.*/

港意:join。方法也会抛出InterruptedException异辛,因此

点编写时势频杷join。方法编写森try-catch块内,否则无族顺

利编锌

14-4同步处理

由二个夜程需要合享照据:势须保证一个假程

系会改变另一个废程使用的微据。例电,电累程序

嗡二个假雀:一个从攵件篌馀的工资而另一个诙[

更新工资,那么就可怩发2微据和篌。Java用同步

方法或同步语句允许对多欲程振作。

一、彼程的同步

用synchronized说明的方法犍侍问对等

商取的对象。点给定的时间片犍,对象碉用一个同

步方法,送防止在多饯程里同步方法冲突。

所嗡对象和类与施督隹格有关,施督程序控制

同步方法彷冏对彖或类。它保证只有一个饯程在保

何令复的时间片里访间赍源,同步方法点倜用谖对

象时获取对象的盅督程本。

咨执行同步方法时,对象被锁侵山致不犍倜用

其他同步方法,一旦方法执行完,施督程等前劭琴

数。由同步方法执行某种方法(电wait()方法),

虚督程序也会寿及,与同步方法市关的横程变得兴

可运行直刎满足备将条件。咨等将条件满足,彼程

毋须获职对象的施督程序这便成为可运行的。

例3:假被有家辍行,它可接受颁客的汇款,每做一

次汇款,便可奸喜或汇款的总颊。现我市的个顽客,

每人都今3次,每次100完粉钱导入,国此量后银行汇

款的总领应该是600完。

//app14_7,没/同步处理的假福

(classCBank;;;;;;;d?rj

privatestaticintsum=O;

publicstaticvoidadd(intn){

iinttmp=sum;iiiiiii

tmp=tmp+n;//累加汇款总额

try{1,1,1,11

Thread.sleep((int)(1000*Math.random()));//小睡

0~1秒斜

catch(lnterruptedExceptione){}

sum=tmp;

System.out.println("sum="+sum);

}

classCCustomerextendsThreadIICCustomer^,健杲自Thread类

{............................................................

publicvoidrun(){IIrun()方法

for(inti=1;i<=3;i++)

CBank.add(100);〃将100无今三次导入

I}............................................................III

}IIII...........................................................II

publicclassapp14_7

(i~।।।।।।।।

publicstaticvoidmain(Stringargs[])

,{iIIIjIiiii

CCustomerc1=newCCustomer();

CCustomerc2=newCCustomer();

c1.start();

c2.start();

}'''''

}1111

rapp14-7OUTPUT一一(汶嗡加synchronized的运行筋累)

sum=100

sum=100

sum=200

sum=300

sum=200

sum=300

------------------------*/IIII

森add()方法瑞加上synchronized关健多

/*app14-7OUTPUT—(加上synchronized的运行给累)

sum=100।।।।।।।।।

sum=200

sum=300।।।।।।।।

sum=400

sum=500

sum=600

*/

本章摘要

1、夜程(thread)是婿程序的运行流程。"多假程”的

机制可也同时运行胳几个程格块,使程本运行的

数率变得史必,也可克服传疣程图语言所无法被

计的冏敢。

2、电果森类里要激活夜程,势领先承备必下列两件事

精,,(1)此类势须是扩展舟Thread类,使自己感,

它的3类。(2)夜程的处理处频褊与点run()方法内。

3、run()方法是定:义点Thread类里的一个方法,因此

出俵程的程序代妈编写森run()方法为,所做的就

是覆呈(overriding)的麻作。

4、Runnable接口里声明了抽象的run()方法,因此我

们势频虚实现Runnable接口的类更确实定义run()

方法O

5、冷松咚起的善程可由下列的脩况所产幺:⑴修俵在调

战及名的wai«),(2)孩俵程本身碉用sleep。,⑶谖狡

程和另一个俵稻oin()我一起深。川,⑼修我

6、鬻*H曹梵铲H!)”俵程是由倜用对彖

也㈣!(L万叫所潦辂,皿核对彖的notify。方法被碉用

2Kl去%噌/2)孩程迷人睡眠(sleep)状态,俚指定

的睡眠忖闷到了。〜

7、青方兴可曾用)方色运行给束,或是由修程调用它的

stop。方法时,则俵程进入漪亡的状态。

8、要简单地微时修程的排程,可用join()方法。

9、

j鹦敲窗湍黑嘴舞勰舞鬣;所“4编

SuccesswithMoneyandJoy

附熠人生心语

•成功是一种观念

•致富是一种义务

•快乐是一种权利

•每个人都有能力、有义

务、有权利办到成功

致富快乐

附赠人生心语

成成功不是打败别人

功成功不是超越别人

成功不是名、利、权的获得

致拥有健康的身体

丰足的物质生活

富平衡的心理状态

又才能拥有成功

快SuccesswithMoneyandJoy

战胜自己

乐贡献自己

扮演好自己的历史角色

才能超越自己

融入成功里

附赠人生心语

知人者智,自知者明,胜人者力,自

胜者强。

——老子

附赠人生心语

•成功必须靠百分之九十八的辛勤血

汗,加上百分之二的天才灵感。

•世界上注定只有百分之二十的人会成

功。

附赠人生心语

成犹太谚语中有一句名言,

功会伤人的东西有三个:苦恼、争吵、空的钱包C

其中最伤人的是——空的钱包。

致金钱本身并没有善恶,

但没有钱,

富却的确是一件不幸的事情。

又所以,我们必须学习

快SuccesswithMoneyandJoy

重视财富,

乐管理财富,

更重要的是要学会

正确地

使用自己的财富。

附赠人生心语

重财-----重视自己的财富

孔子说:“不义而富且贵于我如浮云。”只要

是正正当当的钱,都应该被珍惜、被重视。

附赠人生心语

理贝才-----管理自己的财富

在贫苦和缺钱里挣扎的人,都有一个共同的特

点,就是不会理财,甚至不懂什么是理财。

附噌人生心语

增贝才----增加自己的财富

劳务收入

收入卜

财务收入

附藩人生心语

守贝才-----保护自己的财富

守财三原则:

・不赌钱

・不借钱

•不投资做生意

附僧人生心语

功春有百花秋有月,夏有凉风冬有雪

致若无闲事挂心头,便是人间好时节

又Succes

温馨提示

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

评论

0/150

提交评论