




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
§6-1多窗口售票模拟Java语言程序设计教学目标任务分析大家乘坐高铁出行前会在网上订票或在高铁站窗口买票,因为多个窗口可能会在同一时间售卖同一车次的火车票,必须保证数据一致性。本任务便是利用Java多线程机制,模拟高铁站多个窗口进行售票的过程。目录1线程的创建与启动什么是多线程23线程的同步线程状态与线程控制4一、什么是多线程进程:正在运行着的程序,计算机来说一个任务就是一个进程程序:一组写好了的静态代码块“多任务”:指操作系统能同时运行多个进程(程序)。如Windows系统可以同时运行写字板程序、画图程序、WORD、EXCEL等。1.几个概念线程:线程是进程执行的一个路径单线程:一个进程中只包含一个线程,也就是说一个程序只有一条执行路线。多线程:在单个进程中可以同时运行多个不同的线程执行不同的任务。执行多线程的时候,Java虚拟处理机在多个线程之间轮流切换,不过每个时刻只能有一个线程在执行。main方法是Java的入口程序,一旦进入就启动了一个main线程,所以main线程也称为主线程。一、什么是多线程在Java中,要想创建多线程,有两种方式:一种是继承Thread类,一种是实现Runnable接口。
线程的启动要通过Thread类的start()方法
二、线程的创建与启动1.继承Thread类创建多线程步骤1)创建类,使其继承自Thread类publicclassMyThreadextendsThread{ publicMyThread(){//编写子类的构造方法}
publicvoidrun(){//编写自己的线程代码}}2)创建一个线程对象MyThreadthreadObj=newMyThread();二、线程的创建与启动1.继承Thread类创建多线程步骤3)启动线程threadObj.start();需要注意的是,不要调用Thread类的run()方法。直接调用run()方法只会在当前线程中执行任务,并不会启动新的线程。正确的做法是调用Thread类的start()方法,它会创建一个新的线程来执行run()方法。二、线程的创建与启动2.实现Runnable接口创建多线程步骤1)实现一个使用Runnable接口的类。publicclassMyRunnableThreadimplementsRunnable{ publicMyRunnableThread(){//编写子类的构造方法}
publicvoidrun(){//编写自己的线程代码}}2)创建一个Runnable对象。Runnabler=newMyRunnableThread();3)以Runnable对象做为参数创建一个线程对象。Threadt=newThread(r);二、线程的创建与启动4)启动线程。t.start();publicclassSimpleThreadextendsThread{ privateintcount=2;//循环次数 publicSimpleThread(){//调用父类无带参构造 }
publicSimpleThread(Stringname){//n super(name); //指定调用父类带参构造,设定线程名 } publicvoidrun(){ for(inti=0;i<count;i++){ //getName()获得当前线程名 System.out.println(getName()+":"+i); } }} publicstaticvoidmain(String[]args){
////创建自定义线程类simpleThread1对象,不指定线程名 SimpleThreadsimpleThread1=newSimpleThread(); //使用带名字String参的构造方法创建线程对象 SimpleThreadsimpleThread2=newSimpleThread("新线程2");
simpleThread1.start(); simpleThread2.start(); }示例代码classMyRunnableThreadimplementsRunnable{ privateintcount=2;//循环次数 @Override publicvoidrun(){ for(inti=0;i<count;i++){
//用静态方法currentThread()获得当前线程 System.out.println(Thread.currentThread().getName()+":"+i); } }}
publicstaticvoidmain(String[]args){ //创建自定义线程类myRunnableThread对象,不指定线程名
MyRunnableThreadmyRunnableThread=newMyRunnableThread(); //使用带myRunnableThread参数的构造方法创建线程对象
Threadthread3=newThread(myRunnableThread); //使用带两个参的构造方法创建线程对象
Threadthread4=newThread(myRunnableThread,"新线程4");
thread3.start(); thread4.start(); }示例代码使用继承Thread类的方法创建线程,可以在子类中增加新的成员变量和新的成员函数,使得线程具有新的属性和功能,还可以直接操作线程,但由Java中不支持多继承,因此Thread子类不能扩展其他的类。利用Runnable接口,线程的创建可以从其它类继承,使得代码和数据分开,不过需要使用Thread对象来操纵线程。二、线程的创建与启动三、线程状态与线程同步线程从创建到最终的消亡称为线程的生命周期。线程的整个生命周期包括以下五个状态:新建(生)状态(New)就绪状态(Runnable)运行状态(Running)被阻塞状态(Blocked)死亡状态(Dead)1)新建状态(New):新创建了一个线程对象,这时线程还没工作。2)就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法,该状态的线程处于可运行状态,等待获取CPU的使用权。3)运行状态(Running):就绪状态的线程获取了CPU,程序代码得以执行,线程进入运行状。4)阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。5)死亡状态(Dead):线程执行了或者因异常退出了run()方法,该线程结束生命周期。三、线程状态与线程同步方法(public)功能应用示例staticvoidsleep(longmillis)throwsInterruptedException在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),该线程不丢失任何监视器的所属权。可以被interrupt()方法中断Thread.sleep(1000);//让线程休眠1秒,将线程转换成阻塞状态。staticvoidyield()暂停当前正在执行的线程对象,并执行其他线程Thread.yield();//暂停线程执行,将线程转换成就绪状态。voidsetPriority(intnewPriority)更改线程的优先级,可以设置为在MAX_PRIORITY(定义为10)与MIN_PRIORITY(定义为1)之间的任何值,NORM_PRIORITY被定义为5。MyThreadthreadObj=newMyThread();threadObj.setPriority(10);//线程的优先级是高度依赖于系统的。并不是设为最高一定最先执行intgetPriority()返回线程的优先级intpriority=threadObj.getPriority();voidsetDaemon()将该线程标记为守护线程或用户线程,在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分。threadObj.setDaemon();//必须在线程启动之前调用setDaemon()方法,才能把它设置为后台线程。当所有的非后台线程结束时,程序也就终止了。boolean
isDaemon()测试该线程是否为守护线程booleanflag=threadObj.isDaemon();voidjoin()加入线程,等待该线程终止threadObj.join();//voidinterrupt()
中断线程threadOerrupt();booleaninterrupted()测试线程是否已经中断booleanflag=threadObj.interrupted();三、线程状态与线程同步在多线程的环境中,可以同时做多件事情。但是,两个或多个线程同时使用一个受限资源的问题也出现了,有可能一个线程正在使用某个资源,而另一个线程却在更新它,这样,会造成数据的不正确。例如一个银行账户同时被两个线程操作,一个线程要实现取100元,一个线程实现转账汇入100元。假设账户原本有1000元,如果取钱线程和转账汇入线程同时发生,会出现什么结果呢?如果不进行任何控制则有可能出现取钱成功,账户余额是1100。对于多个线程共享的资源,必须采取措施,使得每次只有一个线程能使用它,这就是多线程中的同步(synchronization)问题。四、线程同步
多线程模式在解决线程冲突问题的时候,多数都是采用序列化访问共享资源的方案。即在给定时刻只允许一个线程访问共享资源。通常这是通过在代码前面加上一条锁语句来实现的,这就保证了在一段时间内只有一个线程运行这段代码。因为锁语句产生了一种互相排斥的效果,所以这种机制常常称为“互斥量”(mutex)。
四、线程同步1)同步方法Java以提供关键字synchronized的形式,为防止资源冲突提供了内置支持。可以通过把方法标记为synchronized的方式来防止资源冲突,下面是声明同步方法的语法。访问控制符synchronized返回值类型方法名称(参数){//方法体;}例:publicsynchronizedvoidmethod1(){}注:每个对象都含有单一的锁(也称为监视器),这个锁本身就是对象的一部分。当在对象上调用其任意synchronized方法的时候,此对象都被加锁,这时该对象上其它synchronized方法只有等到前一个方法调用完成并释放了锁之后才能被调用。四、线程同步
2)同步代码块同步代码块防止多个线程同时访问方法内部的部分代码,而不是防止访问整个方法。synchronized被用来指定某个对象,syncObject对象的锁被用来对花括号内的代码进行同步控制。synchronized(syncObject){ //编写自己的代码}四、线程同步
3)锁对象除了使用synchronized关键字外,JavaSE5.0中引入了ReentrantLock类。使用ReentrantLock类保护代码块的基本结构如下:myLock.lock();try{ //被保护的代码块;}finally{ myLock.unlock();}这一结构确保任何时候只有一个线程访问代码块。解锁操作要放在finally语句。四、线程同步任务实施为实现多窗口售票,需要创建多个线程对象模拟多个窗口,实现步骤如下:创建一个线程类SaleTicketWindow,该类实现Runnable接口,该类中定义一个成员变量ticket,ticket代表当前车次剩余票数。SaleTicketWindow类实现run方法,在run方法体中编写while循环,在循环体中对当前剩余票数ticket进行判断,如果大于零,则表示依然可以售出。调用sleep方法,每隔1秒将当前票数减1,表示售卖一张。为保证同时只有一个线程可执行票数减1操作,将该操作放置在同步代码块中。通过SaleTicketWindow类实现创建多个线程对象,每个线程对象模拟为一个售票窗口,本任务中我们创建三个窗口用于售票。已知银行账户类BankCount,该类有一个成员变量balance表示账户余额。定义线程类,用于对银行账户进行存钱及取钱操作。同时创建多个线程对象,在多个线程对象中对同一银行账户进行存钱及取钱操作,要求加入同步处理,保证数据的一致性。按“工单6-1”要求完成任务同步训练§6-2餐馆点餐场景模拟Java语言程序设计教学目标任务分析
某个餐馆,有一个厨师和一个服务员,服务员必须等待厨师准备好食物才能上菜。当厨师准备好食物时,他通知服务员,后者将得到食物,然后回去继续等待。多个线程在处理同一个资源,并且任务不同时,为了避免对同一共享资源的争夺,需要使用线程间通信机制。目录1线程通信机制为什么要线程通信23死锁一、为什么要线程通信
多个线程并发执行时,在默认情况下CPU是随机切换线程的,当需要多个线程来共同完成一件任务,并且希望它们有规律的执行,那么多线程之间需要一些协调通信,以此来达到多线程共同操作一份数据。多线程之间的通信能够避免对同一共享变量的争夺。二、线程通信机制
线程通信机制通过线程之间的“握手机制”来进行的,这种握手可以通过Object的方法wait()和notify()来安全的实现,也可以通过条件对象来实现。
在一个线程进行了规定操作后,就进入等待状态(wait),等待其他线程执行完他们的指定代码过后再将其唤醒(notify)。典型应用:生产者/消费者模式wait(longmills):接受毫秒数作参数,含义与sleep()方法里参数的意思相同,都是指“在此期间停止”。不同之处在于,对于wait(longmills)而言:1)在wait()调用期间对象锁是释放的。2)可以通过notify()、notifyAll(),或者时间到期,从wait()中恢复执行。无参wait():wait()将无限等待下去,直到线程接收到notify()或notifyAll()消息。一般情况下,在等待某个条件时(这个条件必须由当前方法以外的因素才能改变,一般由另一个线程所改变),就应该使用wait()。因为如果在线程里测试条件的时候空等会极大的占用CPU时间,而wait()允许在等待外部条件的时候让线程休眠,只有在收到notify()或notifyAll()的时候线程才唤醒,并对变化进行检查。二、线程通信机制注意:wait()、notify()以及notifyAll()是Object类的方法,wait()可以放进任何同步控制方法里,也必须放在同步方法或代码块里。sleep()是Thread类的方法,可以在非同步控制方法里调用二、线程通信机制二、线程通信机制
条件对象(Condition)是在JavaSE5.0中引入的。条件对象与锁对象一起使用,一个锁对象可以有一个或多个相关的条件对象,通过锁对象的newCondition()方法可以获得一个条件对象。Condition接口为它的子类提供了await()、signal()和signalAll()三个方法,它们的使用方法与wait()、notify()和notifyAll(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年能见度测试仪项目可行性研究报告
- 减压件行业深度研究分析报告(2024-2030版)
- 中国畜禽养殖业污染现状及防治对策
- 智能交通商业计划书模板
- 兼职平台创业计划书
- 奶牛血吸虫病的防控
- 2025年胶粘带生产制造项目可行性研究报告
- 2025年汽车尾气净化项目投资分析及可行性报告
- 家政商业模式教案
- 美团代运营合同协议书
- 检验科实验室生物安全风险评估
- 石材维修合同范本(2025年)
- 【MOOC】全新版大学进阶英语综合教程I-内蒙古大学 中国大学慕课MOOC答案
- 《南方航空公司汇率风险管理策略案例分析》
- 2025年山东省春季高考模拟考试英语试卷(含答案解析)
- 《气瓶使用安全培训》课件
- 2023年贵州茅台酒厂保健酒业销售有限公司招聘笔试真题
- 中国农业发展史
- T∕CACE 0118-2024 改性磷石膏混合料道路稳定基层应用技术规程
- 带音标单词表(知识清单)-2024-2025学年外研版(三起)(2024)英语三年级上册
- 摄影测量课程设计
评论
0/150
提交评论