《多线程机制》PPT课件.ppt

上传人:m**** 文档编号:568327974 上传时间:2024-07-24 格式:PPT 页数:23 大小:277.01KB
返回 下载 相关 举报
《多线程机制》PPT课件.ppt_第1页
第1页 / 共23页
《多线程机制》PPT课件.ppt_第2页
第2页 / 共23页
《多线程机制》PPT课件.ppt_第3页
第3页 / 共23页
《多线程机制》PPT课件.ppt_第4页
第4页 / 共23页
《多线程机制》PPT课件.ppt_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《《多线程机制》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《多线程机制》PPT课件.ppt(23页珍藏版)》请在金锄头文库上搜索。

1、第第8章章 多线程机制多线程机制8.1 线程基础线程基础8.2 线程控制线程控制8.3 线程线程同步同步8.4 注意事项注意事项8.1 线程基础线程基础 8.1.1 进程和线程进程和线程 计计算算机机的的操操作作系系统统可可以以同同时时执执行行多多个个任任务务。听听歌歌的的同同时时能能够够打打字字、下下载载文文件件,在在聊聊天天窗窗口口打打字字的的时时候候对对方方还还能能通通过过视视频频看看到到你。你。多多任任务务是是指指在在一一个个系系统统中中可可以以同同时时运运行行多多个个程程序序,即即有有多多个个独独立运行的任务,每一个任务对应一个进程。立运行的任务,每一个任务对应一个进程。由于一个由于

2、一个CPU在同一时刻只能执行一个程序中的一条指令。实在同一时刻只能执行一个程序中的一条指令。实际上,多任务运行的并发机制使这些任务交替运行,因间隔时际上,多任务运行的并发机制使这些任务交替运行,因间隔时间短,所以感觉就是多个程序在同时运行。间短,所以感觉就是多个程序在同时运行。 Java语言使用多线程来实现一个程序中的多个任务同时运行。语言使用多线程来实现一个程序中的多个任务同时运行。程序员可以在程序中执行多个线程,每个线程完成一个功能,程序员可以在程序中执行多个线程,每个线程完成一个功能,并与其他并与其他8.1 线程基础线程基础 8.1.1 进程和线程进程和线程 计计算算机机的的操操作作系系

3、统统可可以以同同时时执执行行多多个个任任务务。听听歌歌的的同同时时能能够够打打字字、下下载载文文件件,在聊天窗口打字的时候对方还能通过视频看到你。在聊天窗口打字的时候对方还能通过视频看到你。多多任任务务是是指指在在一一个个系系统统中中可可以以同同时时运运行行多多个个程程序序,即即有有多多个个独独立立运运行行的的任任务务,每一个任务对应一个进程。每一个任务对应一个进程。由于一个由于一个CPU在同一时刻只能执行一个程序中的一条指令。实际上,多任在同一时刻只能执行一个程序中的一条指令。实际上,多任务运行的并发机制使这些任务交替运行,因间隔时间短,所以感觉就是多个务运行的并发机制使这些任务交替运行,因

4、间隔时间短,所以感觉就是多个程序在同时运行。程序在同时运行。 Java语言使用多线程来实现一个程序中的多个任务同时运行。程序员可以在语言使用多线程来实现一个程序中的多个任务同时运行。程序员可以在程序中执行多个线程,每个线程完成一个功能,并与其他线程并发执行,这程序中执行多个线程,每个线程完成一个功能,并与其他线程并发执行,这种机制称为多线程。种机制称为多线程。进进程程(process)是是程程序序的的一一次次执执行行过过程程,是是操操作作系系统统运运行行程程序序的的基基本本单单位位。程程序序是是静静态态的的,进进程程是是动动态态的的。系系统统运运行行一一个个程程序序就就是是一一个个进进程程从从

5、创建、运行到消亡的过程。创建、运行到消亡的过程。系系统统可可以以为为一一个个程程序序同同时时创创建建多多个个进进程程。每每一一个个进进程程都都有有自自己己独独立立的的一一块内存空间和一组系统资源,即使同类进程之间也不会共享系统资源。块内存空间和一组系统资源,即使同类进程之间也不会共享系统资源。操作系统进程1进程2进程3线程1线程2线程3线程具有生命周期,它包含线程具有生命周期,它包含3个状态:出生状态、就绪状态、运行状态。个状态:出生状态、就绪状态、运行状态。出出生生状状态态:用用户户在在创创建建线线程程时时处处于于的的状状态态,在在用用户户使使用用该该线线程程实实例例调调用用start()方

6、法之前都处于出生状态。方法之前都处于出生状态。就绪状态:用户调用就绪状态:用户调用start()之后,线程就处于就绪状态了。之后,线程就处于就绪状态了。运行状态:当线程得到系统资源后就进入运行状态。运行状态:当线程得到系统资源后就进入运行状态。8.1.2线程的生命周期线程的生命周期出生就绪执行等待休眠死亡阻塞Thread t=new Thread();t.start()t.notify()或t.notifyAll()时间片结束得到系统资源t.wait()t.sleep()t.run()例例8.1 获取当前线程对象,并输出当前线程的名称。获取当前线程对象,并输出当前线程的名称。public cl

7、ass MainThread public static void main(String args) System.out.println(main主方法开始运行主方法开始运行);Thread currentThread = Thread.currentThread();System.out.println(成功获取当前线程对象成功获取当前线程对象);String name = currentThread.getName();System.out.println(当前线程的名称是:当前线程的名称是:+name); 8.1.3 认识认识main线程线程Thread类是类是Java语言的线程类,

8、位于语言的线程类,位于java.lang包中。包中。该该类类的的实实例例对对象象是是线线程程对对象象,所所以以继继承承该该类类编编写写线线程程子子类类是实现多线程的方法之一。是实现多线程的方法之一。通过通过Thread类创建线程子类的格式为:类创建线程子类的格式为: class 线程的类名线程的类名 extends Thread public void run() 程序语句程序语句 Thread类的类的start()方法用于启动一个线程对象。方法用于启动一个线程对象。public void start()执行该方法后,执行该方法后,JVM启动该线程对象,并调用该线程的启动该线程对象,并调用该线

9、程的run()方法。方法。 8.1.4 通过继承通过继承Thread类创建线程类创建线程 例例8.2 在在项项目目中中创创建建Writer作作者者类类,该该类类继继承承Thread类类并并重重写写run()方方法法称称为为线线程程类类,在在主主方方法法中中创创建建两两个个作作者者类类的的实实例例对对象象,分分别别设设置置name属属性性为为“张张三三”和和“李李四四”,然然后后同同时时启启动动两两个个线线程程,在控制台查看两个线程的运行情况。在控制台查看两个线程的运行情况。 8.1.4 通过继承通过继承Thread类创建线程类创建线程 public class Writer extends T

10、hread private String name=未知未知“;/ 声明作者名声明作者名public Writer(String name) this.name=name;/ 初始化作者名称初始化作者名称public void run() / 重写重写run()方法方法while (true) System.out.println(name+:写一段文稿写一段文稿); / 输出工作进度输出工作进度 System.out.println(name+:吸一口烟吸一口烟,放松一下。放松一下。); / 输出工作状态输出工作状态 try Thread.sleep(int) (Math.random()

11、* 10000);/ 随机休息几秒随机休息几秒catch (InterruptedException e) e.printStackTrace(); public static void main(String args) Thread writer1 = new Writer(“张三张三); / 创建作者创建作者1线程线程Thread writer2 = new Writer(“t李四李四); / 创建作者创建作者2线程线程writer1.start(); / 张三线程开始工作张三线程开始工作writer2.start(); / 李四线程同时启动李四线程同时启动图图 8.2 运行结果运行结果

12、(1) Application应应用用程程序序运运行行时时总总是是调调用用main方方法法,因因此此main是是创创建建和和启启动动线线程程对对象象的的地地方方。main本本身身也也是是一一个个线线程程,是是程程序序自自动动拥拥有有的的一一个个线线程程,称称为为主主线线程程。在在main方方法法中中创创建建了了两两个个testThread线线程程对对象象: writer1与与writer2,并并在在创创建建后马上调用后马上调用start方法启动了这两个线程。方法启动了这两个线程。(2) 从从输输出出的的结结果果可可以以看看出出两两个个线线程程的的名名字字是是交交替替显显示示的的,这这是是因因为

13、为两两个个线线程程是是同同步步的的,于于是是,两两个个run方方法法也也同同时时被被执执行行。线线程程语语句句的的顺顺序序只只是是决决定定于于线线程程执执行行的的顺顺序序,线线程程的的执执行行顺顺序序是是由由系系统统调调度和控制的。度和控制的。(3) 由由继继承承Thread创创建建的的子子类类,必必须须覆覆盖盖run方方法法,因因为为Thread线线程程类类的的run方方法法是是空空的的。run是是线线程程类类的的关关键键方方法法,线线程程的的所所有有活活动动都都是是通通过过它它来来实实现现的的。当当调调用用线线程程对对象象时时系系统统就就自自动动调调用用其其run方方法法,正正是是通通过过

14、run方方法法才才使使创创建建线线程程的的目目的的得得以以实实现现。run方方法法的的作作用用如如同同Application应应用用程程序序的的main方法一样。方法一样。由例子可以看出,创建线程对象,就是设计由例子可以看出,创建线程对象,就是设计run方方法。一旦启动线程对象,就进入法。一旦启动线程对象,就进入run方法,便执行方法,便执行run中的所有语句,中的所有语句,run方法执行完毕,这个线程也方法执行完毕,这个线程也就结束了。就结束了。 当当一一个个类类是是从从其其他他类类继继承承时时,如如继继承承Frame类类。此此时时就就不不能能再再继继承承Thread类类来来创创建建线线程程

15、。这这时时可可以以通通过过接接口口Runnable直直接接创创建建线线程程对对象象。接接口口Runnable是是一一个个抽抽象象接接口口,接接口口中只声明了一个未实现的中只声明了一个未实现的run方法。方法。package java.lang;public interface Runnablepublic abstract void run();实实现现Runnable接接口口的的对对象象需需要要传传递递给给Thread类类的的构构造造方方法法,通通过过Thread构构造造方方法法去去创创建建线线程程类类,也也就就是是说说Runnable接接口口的的实实现现对对象象需需要传递给要传递给Thre

16、ad的实例对象才能启动线程的实例对象才能启动线程。Thread(Runnable target)Thread(Runnable target,String name)8.1.5 通过通过Runnable接口创建线程接口创建线程 使用使用Runnable接口启动新线程的步骤如下:接口启动新线程的步骤如下:(1)建立)建立Runnable接口实例对象。接口实例对象。(2)以)以Runnable接口实例对象创建接口实例对象创建Thread实例对象。实例对象。(3)调用)调用Thread线程对象的线程对象的start()方法启动线程。()方法启动线程。Thread对象Runnable对象启动线程,执行

17、run()方法中的代码根据Runnable对象创建Thread对象调用start()方法例8.2 创建窗体,在窗体中布局一个文本域组件。见案例RunnableDemo.java两种创建线程方法的比较:两种创建线程方法的比较: (1) 由由继继承承Thread类类创创建建线线程程对对象象简简单单方方便便,可可以直接操作线程,但不能再继承其他类;以直接操作线程,但不能再继承其他类;(2) 在继承其他类的类中可用在继承其他类的类中可用Runnable接口创建接口创建线程对象。可保持程序风格的一致性。线程对象。可保持程序风格的一致性。 1、线程的休眠:、线程的休眠:tryThread.sleep(20

18、00); catch(InterruptedException e)e.printStackTrace();8.2 线程控制线程控制2、线程的停止:、线程的停止:早早期期JDK版版本本中中使使用用stop()方方法法停停止止线线程程,新新版版本本中中废废除除了了。现现在在提提倡倡在在run()方方法法中中使使用用布布尔尔型型标标记记控制循环的停止。控制循环的停止。例如:例如:public class InterruptedTest implements Runnableprivate boolean isContinue=false;public void run()while(true)if

19、(isContinue) break;public void setContinue()this.isContinue=true;3、 线程的调度线程的调度当当前前某某程程序序为为多多线线程程程程序序,假假如如存存在在一一个个线线程程A,此此时时需需要要插插入入线线程程B,并并要要求求线线程程B先先执执行行完完毕毕,然然后后在在继继续续执执行行线线程程A,这这时时可可以以使使用用join()方方法法。就就好好比比你你正正在在看看电电视视却却突突然然有有人人上上门门收收水水费费,你你必必须付完水费才能继续看电视。见案例须付完水费才能继续看电视。见案例JoinTest.java在在单单线线程程程程

20、序序中中,每每次次只只能能做做一一件件事事情情,后后面面的的事事情情也也需需要要等等待待前前面面的的事事情情完完成成后后才才可可以以进进行行,如如果果使使用用多多线线程程程程序序,虽虽然然能能够够实实现现多多处处理理,但但是是会会发发生生两两个个以以上上的的线线程程抢抢占占资资源源的的问问题题,例例如如两两个个人人同同时时使使用用一一个个麦麦克克风风,多多个个人人同同时时向向同同一一个个账账户户汇汇款款等等。在在多多线线程程编编程程中中,必必须须防防止止这这些资源访问的冲突。些资源访问的冲突。Java提供线程同步的机制可以防止资源访问的冲突。提供线程同步的机制可以防止资源访问的冲突。8.3 线

21、程的同步机制线程的同步机制8.3.1 线程安全线程安全火车站售票系统火车站售票系统-在代码中判断网络中当前剩在代码中判断网络中当前剩余票数是否大于余票数是否大于0,如果大于,如果大于0则执行售票功能则执行售票功能-当两个线程同时访问这段代码时(假如这时当两个线程同时访问这段代码时(假如这时只剩下只剩下1张票),第一个线程将票售出张票),第一个线程将票售出-第二个线程已经执行完成判断是否有票的操作,并第二个线程已经执行完成判断是否有票的操作,并得出结论票数得出结论票数0,这样它售出票那么就会产生负,这样它售出票那么就会产生负数。见案例数。见案例ThreadSaftTest.java 8.3.2

22、线程同步机制线程同步机制如如何何解解决决资资源源共共享享的的问问题题,基基本本上上所所有有解解决决多多线线程程资资源源冲冲突突问问题题的的方方法法,都都是是在在指指定时间段内只允许一个线程访问共享资源,这时就需要给共享资源上一道锁了。定时间段内只允许一个线程访问共享资源,这时就需要给共享资源上一道锁了。1。同步块。同步块synchronized (object)/业务代码业务代码object:同步块锁定的对象:同步块锁定的对象通通常常将将共共享享资资源源的的操操作作放放置置在在synchronized定定义义的的代代码码内内,这这样样其其它它线线程程也也获获取取到到这个锁时,必须等待代码块的对

23、象锁被释放时才能进入该区域。这个锁时,必须等待代码块的对象锁被释放时才能进入该区域。案例案例ThreadSafeTest.java是对是对ThreadSaftTest.java的修改。的修改。2。同步方法。同步方法synchronized void syncMethod(。)。/方法体方法体档档某某个个对对象象调调用用了了同同步步方方法法,其其它它方方法法必必须须等等待待该该同同步步方方法法执执行行完完毕毕才才能能被被执执行行。所所以以将将每每个个能能访访问问共共享享资资源源的的方方法法修修饰饰为为synchronized可可以以防防止止多多个个县县城城同同时时修修改改或访问共享资源。见案例或

24、访问共享资源。见案例ThreadSafe.java考考虑虑到到多多线线程程时时,人人们们立立刻刻会会想想到到某某些些任任务务是是可可以以使使用用多多线线程程的的,例例如如数数据据计计算算、数数据据库库查查询询,以以及及输输入入的的获获得得。因因为为这这些些任任务务通通常常都都被被认认为为是是后后台台任任务务,不不直直接接与与用用户户打打交交道道。在在Java语语言言程程序序设设计计中中,动动态态效效果果的的程程序序都都会会使使用用多多线线程程,例例如如动动画画的的播播放放、动态的字幕,等等。动态的字幕,等等。8.4 何时使用多线程及注意问题何时使用多线程及注意问题 在在程程序序中中使使用用多多

25、线线程程是是有有代代价价的的。它它会会对对系系统统产产生生以下影响:以下影响: (1) 线程需要占用内存;线程需要占用内存;(2) 线程过多,会消耗大量线程过多,会消耗大量CPU时间来跟踪线程;时间来跟踪线程;(3) 必必须须考考虑虑多多线线程程同同时时访访问问共共享享资资源源的的问问题题,如如果果没没有有协协调调好好,就就会会产产生生令令人人意意想想不不到到的的问问题题,例如可怕的死锁和资源竞争;例如可怕的死锁和资源竞争;(4) 因为同一个任务的所有线程都共享相同的地因为同一个任务的所有线程都共享相同的地址空间,并共享任务的全局变量,所以程序也必须址空间,并共享任务的全局变量,所以程序也必须考虑多线程同时访问全局变量的问题。考虑多线程同时访问全局变量的问题。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号