Java面向对象程序设计 教学课件 ppt 作者 梁燕来 程裕强 第11章 多线程

上传人:E**** 文档编号:89400088 上传时间:2019-05-24 格式:PPT 页数:44 大小:527.50KB
返回 下载 相关 举报
Java面向对象程序设计 教学课件 ppt 作者  梁燕来 程裕强 第11章 多线程_第1页
第1页 / 共44页
Java面向对象程序设计 教学课件 ppt 作者  梁燕来 程裕强 第11章 多线程_第2页
第2页 / 共44页
Java面向对象程序设计 教学课件 ppt 作者  梁燕来 程裕强 第11章 多线程_第3页
第3页 / 共44页
Java面向对象程序设计 教学课件 ppt 作者  梁燕来 程裕强 第11章 多线程_第4页
第4页 / 共44页
Java面向对象程序设计 教学课件 ppt 作者  梁燕来 程裕强 第11章 多线程_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《Java面向对象程序设计 教学课件 ppt 作者 梁燕来 程裕强 第11章 多线程》由会员分享,可在线阅读,更多相关《Java面向对象程序设计 教学课件 ppt 作者 梁燕来 程裕强 第11章 多线程(44页珍藏版)》请在金锄头文库上搜索。

1、第11章 多线程,主讲人:程裕强,主要内容,了解进程与线程的概念 掌握创建线程的两种方法 了解线程常用的方法 了解线程的生命周期 了解线程安全 了解临界资源 了解互斥机制 了解同步机制 了解守护线程,11.1基本概念,计算机操作系统的发展分为多个阶段: 1)单用户单任务操作系统,比如DOS,只允许登陆的用户是一个,只可以运行一个程序,该程序退出后才能运行其他程序; 2)单用户多任务操作系统,比如Windows 98,只允许登陆的用户是一个,同时可以远行多个程序; 3)多任务多用户操作系统:允许多个用户使用,同时可以远行多个程序,比如Windows XP、Linux。,一个任务一般对应一个进程。

2、 进程是一个程序在给定的数据集合上的一次执行过程,是系统进行资源分配和运行调度的独立单位。 线程是某一进程中一路单独运行的程序。也就是说,进程由若干线程构成,线程存在于进程之中。 各线程共享相同的代码和全局数据,但各有其自己的堆栈。由于所有线程共享同样的代码和全局数据,它们比进程更紧密,比单独的进程间更趋向于相互作用,线程间的相互作用更容易些,因为它们本身就有某些供通信用的共享内存:进程的全局数据。 比如,我登陆一个QQ,操作系统中就要一个QQ进程在运行,QQ进程中又有多个线程(好友消息线程、文件传递线程、QQ等级线程、QQ群线程)。,11.2创建多线程,前面写的程序大都是单线程程序,只有一条

3、执行路径,即是从主方法第一句开始执行,依次执行每条语句直到主方法的最后一句,也就是说该Java应用程序的进程只有一个线程。 Java是多线程的操作语言,提供了线程处理机制。 在Java中可以有2种方式实现多线程操作,一是继承Thread类,另一种是实现Runnable接口。,11.2.1 Thread,Thread类定义在java.lang包中,只要Thread的子类重写了run方法就可以实现多线程。run方法规定了该线程的具体使命。 Thread类start方法:启动线程,通过JVM自动调用Thread类的run方法。 例1:继承Thread类,定义多线程。,public class Thr

4、eadTest extends Thread private String name; / 定义name属性 public MyThread(String name) this.name = name; public void run() / 重写 for (int i = 0; i 10; i+) System.out.println(name+i); public static void main(String args) ThreadTest t1 = new ThreadTest(“线程A“) ; ThreadTest t2 = new ThreadTest(“线程B“) ; t1.s

5、tart(); /启动线程A t2.start() ; /启动线程B for(int i=0;i10;i+) System.out.println(“主线程“+i); ,由执行结果可以看出主线程、线程A和线程B交替执行,也就是三个线程同时向前推进执行。,11.2.2 Runnable,如果一个子类需要继承某个父类又要实现多线程,该怎么办? 因为Java是单继承,子类不能同时继承两个父类,但是可以实现多个接口。也就是说子类可以实现Runnable接口来实现多线程机制。 Runnable接口中只有一个方法void run()方法,子类只需实现run方法就可实现Runnable接口。 例2:测试实现

6、Runnable的多线程程序。,public class RunnableTest implements Runnable private String name; /定义name属性 public RunnableTest(String name) this.name = name; public void run() /重写 for (int i = 0; i 100; i+) System.out.println(name+i); public static void main(String args) RunnableTest run1=new RunnableTest(“张三“);

7、RunnableTest run2=new RunnableTest(“李四“); new Thread(run1).start(); /启动“张三”线程 new Thread(run2).start(); /启动“李四”线程 for(int i=0;i100;i+) System.out.println(“主线程“+i); ,可以发现主线程、张三线程和李四线程交替执行。,11.2.3 简单应用(选学),例3:假设当日从A地到B地的火车票只有10张,允许在3个窗口同时发售这10张火车票,通过多线程模拟火车站售票系统。每个窗口相当于1个线程,3个线程处理同一个资源,即是10张火车票。对于同一张车

8、票只能出售一次。 首先,我们尝试通过继承Thread类来定义售票线程。编写Tickets类,继承Thread类,重写run方法,循环卖出10张票;再编写一个测试类SaleTicket1,生成三个售票窗口,也就是三个线程同时售票。,public class SaleTicket1 extends Thread private int tickets = 10; /10张火车票 public void run() /重写run()方法 for(int i=1;i 0) System.out.println(“车票:ticket=“+this.tickets-); public static voi

9、d main(String args) SaleTicket1 t1=new SaleTicket1(); SaleTicket1 t2=new SaleTicket1(); SaleTicket1 t3=new SaleTicket1(); System.out.println(“开始售票:“); /启动三个线程 t1.start(); t2.start(); t3.start(); ,从运行结果中发现该售票程序存在问题,比如第10张火车票出售了3次。分析原因发现,每个线程都是独立运行的,彼此之间没有关系。,然后,我们尝试通过实现Runnable接口来实现多线程售票系统。定义Tickets类

10、,实现Runnable接口,重写run方法进行循环售票;再编写一个测试SaleTicket2,定义一个Tickets类对象t,然后以t为参数定义三个线程窗口,同时售票。 class Tickets implements Runnable private int tickets = 10; /10张火车票 public void run() /重写run()方法 for(int i=1;i 0) System.out.println(“售出车票:“+this.tickets-); ,public class SaleTicket2 public static void main(String a

11、rgs) Tickets t=new Tickets(); System.out.println(“开始售票:“); /定义三个线程窗口,并启动线程 new Thread(t,“窗口1“).start(); new Thread(t,“窗口2“).start(); new Thread(t,“窗口3“).start(); ,从运行结果图可以发现,每张票只出售一次,实现Runnable接口的多线程程序很好的模拟了火车票多窗口售票系统。对比继承Thread的程序,发现本例中在构造三个售票窗口对象时,拥有同一个参数t,也就是说这三个线程共享对象t中的数据。,11.3 线程详解 11.3.1线程方法,

12、Runnable接口中只有一个run方法,线程的主要方法都是Thread中定义,11.3.2线程生命周期,进程是有生命周期的,同样线程也有生命周期及某一时刻的状态。如图11.5所示,一个完整的线程生命周期通常要经历如下4到5个状态。,11.3.3示例,例4:线程名称。 class Tickets implements Runnable private int tickets = 10; /10张火车票 public void run() /重写run()方法 String window=Thread.currentThread().getName(); for(int i=1;i 0) Sys

13、tem.out.println(window+“售出车票:“+this.tickets-); ,public class SaleTicket3 public static void main(String args) Tickets t=new Tickets(); System.out.println(“开始售票:“); new Thread(t,“窗口1“).start(); new Thread(t,“窗口2“).start(); new Thread(t,“窗口3“).start(); ,例5:线程休眠。 线程调用Thread.sleep()方法进入休眠状态,即是由运行态转换为阻塞态

14、。 class Tickets implements Runnable private int tickets = 10; /10张火车票 public void run() /重写run()方法 String window=Thread.currentThread().getName(); for(int i=1;i 0) System.out.println(window+“售出车票:“+this.tickets-); try /售出一张票后,休眠500毫秒 Thread.sleep(500); catch (InterruptedException e) e.printStackTrac

15、e(); ,public class SaleTicket4 public static void main(String args) Tickets t=new Tickets(); System.out.println(“开始售票:“); new Thread(t,“窗口1“).start(); new Thread(t,“窗口2“).start(); new Thread(t,“窗口3“).start(); ,例6:线程中断。 比如夜间只有一个售票窗口,如果该窗口出现休眠状态,主程序应该唤醒该休眠的线程。 public class SaleTicket5 public static vo

16、id main(String args) Tickets t=new Tickets(); Thread window1 =new Thread(t,“窗口1“); window1.start(); /只有一个窗口售票 window1.interrupt(); /中断,唤醒休眠的线程 下面是Tickets类代码,class Tickets implements Runnable private int tickets = 3; /3张火车票 public void run() /重写run()方法 System.out.println(“1.开始售票“); String window=Threa

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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