当前位置:文档之家› 福建工程学院2016年Java基础第5章课件

福建工程学院2016年Java基础第5章课件

让IT教学更简单,让IT学习更有效
第五章 多线程
• 多线程的概念 • 线程创建的两种方式 • 线程的生命周期及状态转换
• 线程的调度 • 线程的安全和同步 • 多线程通信
目录
让IT教学更简单,让IT学习更有效
线程概述 线程的创建
线程的生命周期及状态转换 线程的调度
多线程同步 多线程通信
5.1 线程概述
不难看出,mutex是semaphore的一种特殊情况(n=1时)。 也就是说,完全可以用后者替代前者。但是,因为mutex较为简 单,且效率高,所以在必须保证资源独占的情况下,还是采用 这种设计。
5.2 线程的创建
多线程的两种创建方法:
让IT教学更简单,让IT学习更有效
(1)通过继承ng.Thread类来创建并启动多 线程。
5.1 线程概述
让IT教学更简单,让IT学习更有效
车间的空间是工人们共享的,比如许多房间是每个工人 都可以进出的。这象征一个进程的内存空间是共享的, 每个线程都可以使用这些共享内存。
5.1 线程概述
让IT教学更简单,让IT学习更有效
可是,每间房间的大小不同,有些房间最多只能容纳一 个人,比如厕所。里面有人的时候,其他人就不能进去 了。这代表一个线程使用某些共享内存时,其他线程必 须等它结束,才能使用这一块内存。
5.1 线程概述
让IT教学更简单,让IT学习更有效
一个防止他人进入的简单方法,就是门口加一把锁。先 到的人锁上门,后到的人看到上锁,就在门口排队,等 锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩 写 Mutex),防止多个线程同时读写某一块内存区域。
5.1 线程概述
让IT教学更简单,让IT学习更有效
5.2 线程的创建
让IT教学更简单,让IT学习更有效
• 5.2.3 两种实现多线程方式的对比分析 – 假设售票厅有四个窗口可发售某日某次列车的100张车 票,这时,100张车票可以看做共享资源,四个售票窗 口需要创建四个线程,为了更直观显示窗口的售票情 况,可以通过Thread的currentThread()方法得到当前 的线程的实例对象,然后调用getName()可以获取到线 程的名称。
5.2 线程的创建
让IT教学更简单,让IT学习更有效
线程的基本信息 方法功 能
(1) isAlive() 判断线程是否还“活”着,即线程是否还未终止。
(2) getPriority() 获得线程的优先级数值
(3) setPriority() 设置线程的优先级数值
(4) setName() 给线程一个名字
5.2 线程的创建
让IT教学更简单,让IT学习更有效
• 5.2.3 两种实现多线程方式的对比分析
Example05.java
– 为了保证资源共享,在程序中只能创建一个售票对象,然后开启 多个线程去运行这同一个售票对象的售票方法,简单来说就是四 个线程运行同一个售票程序,这时就需要用到多线程的第二种实 现方式。
5效
• 5.2.2 实现Runnable接口创建多线程
– 实现Runnable接口创建多线程
Example03.java
5.2 线程的创建
让IT教学更简单,让IT学习更有效
• 5.2.2 实现Runnable接口创建多线程
– 运行结果
– MyThread类实现了Runnable接口,并重写了Runnable接口中的 run()方法,通过Thread类的构造方法将MyThread类的实例对象 作为参数传入。从运行结果可以看出,main()方法和run()方法中 的打印语句都执行了,说明例程实现了多线程。
5.1 线程概述
进程和线程的一个简单解释:
让IT教学更简单,让IT学习更有效
计算机的核心是CPU,它承担了所有的计算任 务。它就像一座工厂,时刻在运行。
5.1 线程概述
让IT教学更简单,让IT学习更有效
假定工厂的电力有限,一次只能供给一个车间使用。也 就是说,一个车间开工的时候,其他车间都必须停工。 背后的含义就是,单个CPU一次只能运行一个任务。
让IT教学更简单,让IT学习更有效
• 5.1.1 进程与线程
• 进程:运行中的应用程序称为进程,拥有系统资 源(cpu、内存)
• 线程:进程中的一段代码,一个进程中可以有多 段代码。本身不拥有资源(共享所在进程的资源 )
• 多进程: 在操作系统中能同时运行多个任务(程序) • 多线程: 在同一应用程序中有多个功能流同时执行
– 将例程5-4进行修改,并使用构造方法Thread(Runnable target, String name)在创建线程对象的同时指定线程的名称。
5.2 线程的创建
让IT教学更简单,让IT学习更有效
• 5.2.3 两种实现多线程方式的对比分析
– 实现Runnable接口相对于继承Thread类来说,有如下显著好处:
让IT教学更简单,让IT学习更有效
• 5.2.1 继承Thread类创建多线程
– 运行结果
两个while循环中的打印语句轮流执行了,说明该例程实 现了多线程
5.2 线程的创建
让IT教学更简单,让IT学习更有效
• 5.2.2 实现Runnable接口创建多线程 (2) 实现Runnable接口来创建并启动多线程的步骤如下: ① 定义Runnable接口的实现类,并重写该接口的run方法
– 运行结果
– 结果可以看出,程序一直打印的是“MyThread类的 run()方法在运行”,这是因为该程序是一个单线程程 序,当调用MyThread类的run()方法时,遇到死循环, 循环会一直进行。
– 如果希望例程5-1中两个while循环中的的打印语句能够 并发执行,就需要实现多线程。
5.2 线程的创建
MyThread myThread = new MyThread(); myThread.start(); } }
5.2 线程的创建
让IT教学更简单,让IT学习更有效
• 5.2.1 继承Thread类创建多线程
– 通过继承Thread类的方式来实现多线程
Example02.java
5.2 线程的创建
(5) getName() 取得线程的名字
(6) currentThread() 取得当前正在运行的线程对象,即取得自己本身
5.2 线程的创建
让IT教学更简单,让IT学习更有效
• 5.2.3 两种实现多线程方式的对比分析
– 通过继承Thread类的方式来实现多线程的创建 Example04.java
SencondThread st = new SencondThread(); new Thread(stT);hread thread = new Thread(new MyRunable()); 创建Thread对t象hre时a为d.s该taTrht(r)e;ad对象指定一个名字 new Th}read(st,”新线程1”); }
此时它不能运行,和其它Java对象一样,仅仅由Java虚拟 机为其分配了内存,没有表现出任何线程的动态特征。
新建就绪:通过调用start方法进入就绪状态
5.3 线程的生命周期及 状态转换
让IT教学更简单,让IT学习更有效
• 2、就绪状态(Runnable) 处于就绪状态的线程已经具备了运行条件,但还没有分配
(2) 实现ng.Runnable接口来创建并启动多 条线程。
5.2 线程的创建
让IT教学更简单,让IT学习更有效
• 5.2.1 继承Thread类创建多线程
– 单线程程序
Example01.java
5.2 线程的创建
让IT教学更简单,让IT学习更有效
• 5.2.1 继承Thread类创建多线程
,该run方法的方法体同样是该线程的线程执行体。 ② 创建Runnable实现类的实例,并以此为实例作为Thread
的参数来创建Thread对象,该Thread对象才是真正的线 程对象。 ③ start方法来启动该线程。
5.2 线程的创建
让IT教学更简单,让IT学习更有效
(2) 实现Runnable接口来创建并启动多条线程的步骤如下:
让IT教学更简单,让IT学习更有效
• 5.2.1 继承Thread类创建多线程 (1) 通过继承Thread类来创建并启动多线程的步骤:
① 定义Thread类的子类,并重写该类的run方法,run方法 称为线程执行体。
② 创建Thread子类的实例 ③ start方法来启动该线程。
5.2 线程的创建
5.2 线程的创建
让IT教学更简单,让IT学习更有效
• 5.2.3 两种实现多线程方式的对比分析
– 运行结果
– 可以看出,每张票都被打印了四次。出现这样现象的原因是四个 线程没有共享100张票,而是各自出售了100张票。在程序中创建 了四个TicketWindow对象,就等于创建了四个售票程序,每个程 序中都有100张票,每个线程在独立地处理各自的资源。
还有些房间,可以同时容纳n个人,比如厨房。也就是说 ,如果人数大于n,多出来的人只能在外面等着。这好比 某些内存区域,只能供给固定数目的线程使用。
5.1 线程概述
让IT教学更简单,让IT学习更有效
这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把 钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了, 就知道必须在门口排队等着了。这种做法叫做"信号量"( Semaphore),用来保证多个线程不会互相冲突。
5.1 线程概述
让IT教学更简单,让IT学习更有效
• 5.1.1 进程与线程
• 在java中,程序入口被自动创建为主线程, 在主线程中可以创建多个子线程。
• 区别: 1、是否占有资源问题 2、创建或撤销一个进程所需要的开销比创 建或撤销一个线程所需要的开销大。
相关主题