Java程序设计课件第九章 多线程

上传人:我*** 文档编号:142099032 上传时间:2020-08-16 格式:PPT 页数:36 大小:269KB
返回 下载 相关 举报
Java程序设计课件第九章 多线程_第1页
第1页 / 共36页
Java程序设计课件第九章 多线程_第2页
第2页 / 共36页
Java程序设计课件第九章 多线程_第3页
第3页 / 共36页
Java程序设计课件第九章 多线程_第4页
第4页 / 共36页
Java程序设计课件第九章 多线程_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《Java程序设计课件第九章 多线程》由会员分享,可在线阅读,更多相关《Java程序设计课件第九章 多线程(36页珍藏版)》请在金锄头文库上搜索。

1、1,第九章 多线程,2,目录,9.1 多线程的基本概念 9.2 线程的使用 9.3 线程的优先级 9.4 线程的数据共享 9.5 线程的同步 9.6 线程间通信,3,课前思考,什么是进程? 如何让程序同时执行多个任务?,4,9.1 多线程的基本概念,9.1.1 程序、进程和多任务 程序: 是数据描述与操作代码的集合 静态的 进程: 程序的一次执行过程,是操作系统运行程序的基本单位。 动态的 多任务: 指在一个系统中可以同时运行多个程序,即有多个独立运行的任务 通常,每一个任务对应一个进程,5,9.1 多线程的基本概念,9.1.2 线程 进程中的实体 程序中单个顺序的控制流 一个进程可以拥有多个

2、线程 一个线程必须有一个父进程 与父进程的其它线程共享该进程所拥有的全部资源 进程可以创建和撤消线程实现程序的并发执行,6,9.1 多线程的基本概念,9.1.2 线程 虚拟CPU (java.lang.Thread) 执行的代码 操作的数据,7,9.1 多线程的基本概念,9.1.3 线程的生命周期与状态 生命周期 线程从创建、运行到消亡的过程 线程的状态 创建(New) 可运行(Runnable) 运行中(Running) 挂起(NotRunnable) 死亡(Dead),8,9.1 多线程的基本概念,9.1.3 线程的生命周期与状态,9,9.2 线程的使用,创建线程的两种方法 通过继承 Th

3、read类来创建线程 建立实现 Runnable接口的类来创建线程,10,9.2 线程的使用,9.2.1 通过继承 Thread 类创建线程 例:计算某个整数的阶乘 class FactorialThread extends Thread private int num; public FactorialThread( int num ) this.num=num; public void run() /线程体 int i=num; int result=1; while(i0) result=result*i; i=i-1; System.out.println(The factorial

4、of +num+ is +result); ,11,9.2 线程的使用,测试程序 public class TestFactorialThread public static void main( String args ) System.out.println(main thread starts); FactorialThread thread=new FactorialThread(10); thread.start(); ,12,9.2 线程的使用,9.2.1 通过继承 Thread 类创建线程 构造方法: public Thread() 分配新的Thread 对象。自动生成一个名称为

5、Thread-+n,其中的n为整数的线程对象。 public Thread(Runnabletarget) 分配新的Thread对象。自动生成一个名称为Thread-+n,其中的n为整数的线程对象,并使用target作为运行对象,也就是执行target中的run方法。 public Thread(Stringname) 分配一个线程名为name的Thread对象,13,9.2 线程的使用,9.2.1 通过继承 Thread 类创建线程 常用方法: public void start() 使该线程开始执行;Java 虚拟机调用该线程的run方法。 public static void sleep

6、(longmillis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。 public final void setPriority(intnewPriority) 更改线程的优先级。 public final void setName(Stringname) 改变线程名称 public final int getPriority() 返回线程的优先级 public final String getName() 返回该线程的名称 public void run() 该方法不执行任何操作,Thread 的子类应该重写该方法 public static Thread currentThre

7、ad() 返回对当前正在执行的线程对象的引用,14,9.2 线程的使用,9.2.2 通过 Runnable接口创建线程 多线程机制的一个重要部分,只有一个run()方法 可以用实现Runnable接口的类来创建线程 在编写复杂程序时相关的类可能已经继承了某个基类,而Java不支持多继承,在这种情况下,便需要通过实现Runnable接口来生成多线程,15,9.2 线程的使用,9.2.2 通过 Runnable接口创建线程 例:使用Runnable接口实现阶乘 class FactorialRunnable implements Runnable private int num; public F

8、actorialRunnable( int num ) this.num=num; public void run() int i=num; int result=1; while(i0) result=result*i; i=i-1; System.out.println(The factorial of +num+ is +result); ,16,9.2 线程的使用,测试类 public class TestRunnable public static void main( String args ) System.out.println(main thread starts); Fac

9、torialRunnable t=new FactorialRunnable(10); new Thread(t).start(); ,17,9.3 线程的优先级,线程调度 在单CPU的系统中,多个线程需要共享CPU,在任何时间点上实际只能有一个线程在运行 控制多个线程在同一个CPU上以某种顺序运行称为线程调度 Java虚拟机支持一种非常简单的、确定的调度算法,叫做固定优先级算法。这个算法基于线程的优先级对其进行调度,18,9.3 线程的优先级,线程的优先级 每个Java线程都有一个优先级,其范围都在1和10之间。默认情况下,每个线程的优先级都设置为5 MAX_PRIORITY最大优先级(值为

10、 10) MIN_PRIORITY最小优先级(值为 1) NORM _PRIORITY默认优先级(值为 5) 在线程A运行过程中创建的新的线程对象B,初始状态具有和线程A相同的优先级 可在线程创建之后的任何时候,通过setPriority(int priority)方法改变其原来的优先级,19,9.3 线程的优先级,public class TestPriority extends Thread public static void main(String args) TestPriority t=new TestPriority 4; for(int i=0;i4;i+) ti=new Te

11、stPriority(); for(int i=0;i4;i+) ti.start(); t1.setPriority(MIN_PRIORITY); t3.setPriority(MAX_PRIORITY); public void run() for(int i=0;i1000000;i+) i+; System.out.println(getName()+线程的优先级是+getPriority()+已计算完毕!); ,20,9.4 线程间数据共享,代码共享 多个线程的执行代码来自同一个类的run方法时,即称它们共享相同的代码 数据共享 当共享访问相同的对象时,即它们共享相同的数据 使用Ru

12、nnable接口可以轻松实现多个线程共享相同数据,只要用同一个实现了Runnable接口的实例作为参数创建多个线程就可以了,21,9.4 线程间数据共享,例:用三个线程模拟三个售票口,总共出售200张票 用3个线程模仿3个售票口的售票行为 3个线程应该共享200张票的数据,22,9.4 线程间数据共享,class SellTickets implements Runnable private int tickets=200; public void run() while(tickets0)System.out.println(Thread.currentThread().getName()+

13、 is selling ticket +tickets-); ,23,9.4 线程间数据共享,public class TestSellTickets public static void main(String args) SellTickets t=new SellTickets(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); ,24,9.5 线程的同步,例:一个银行帐号被两个人A和B同时拥有,两个人可以在不同的地方对此帐号进行操作。一天,A往帐号中存入1000元,与此同时,B从该帐号中分别取出

14、500和300元。最后,打印出该帐号的余额,25,9.5 线程的同步,class Bank private int balance = 2000; public void withdraw(int num) int temp = balance; temp = temp - num; /try /Thread.sleep(1000); /catch(InterruptedException e) / balance = temp; System.out.println(余额为:+balance); public void deposit(int num) int temp = balance;

15、 temp = temp + num; try Thread.sleep(1000); catch(InterruptedException e) balance = temp; System.out.println(余额为:+balance); ,26,9.5 线程的同步,class Customer extends Thread Bank bank = null; public Customer(Bank bank) this.bank = bank; public void run() bank.withdraw(500); bank.withdraw(300); class Produ

16、cer extends Thread Bank bank = null; public Producer(Bank bank) this.bank = bank; public void run() bank.deposit(1000); ,27,9.5 线程的同步,public class TestCustomerProducer public static void main(String args) Bank b = new Bank(); Customer c1 = new Customer(b); Producer p1 = new Producer(b); p1.start(); c1.start(); ,28,9.5 线程的同步,如何避免上面这种意外呢? 解决线程的同步问题 Java 使用的同步机制是监视器 每个对象都只有一个“锁旗标”,利用多线程对其的争夺可实现线程间的互斥操作 当A获得了一个对象的锁旗标后,B必须等待A完成规定

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

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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