毕业设计JAVA多线程同步机制及其应用10.doc_第1页
毕业设计JAVA多线程同步机制及其应用10.doc_第2页
毕业设计JAVA多线程同步机制及其应用10.doc_第3页
毕业设计JAVA多线程同步机制及其应用10.doc_第4页
毕业设计JAVA多线程同步机制及其应用10.doc_第5页
免费预览已结束,剩余37页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业设计(论文)JAVA多线程同步机制及其应用10 目 录JAVA多线程同步机制及其应用11 前言211 线程212 同步机制22 JAVA多线程321 线程的创建3com 继承Thread类实现多线程3com 实现Runnable接口实现多线程322 线程管理4com 线程周期4com 线程控制4com 线程的调度53 多线程同步机制631 多线程的问题632 JAVA同步机制8com synchronized关键字8com synchronized方法10com 同步机制的问题11com wait notify 方法134 交通灯管理系统1441 设计方法1442 具体实现1543 主要功能及类介绍155 结束语16致 谢16参考文献17附 录18JAVA多线程同步机制及其应用摘要 介绍了JAVA线程的概念分析了多线程和同步机制给出了创建线程的两种方法继承Thread类和实现runnable接口及其基本格式详细分析了线程周期中的五种状态线程的控制的几种基本的方法start stop sleep 等线程的调度优先级结合具体实例指出了多线程存在的一些问题探讨了实现JAVA同步机制的两种方法synchronized关键字和synchronzied方法给出了解决假同步和死锁的方法介绍了多线程间通信的一种方法wait notify 方法以及该方法的主要格式应用范围和应用要注意的事项通过一个具体的综合应用的实例说明多线程在实际中的应用关键词 多线程同步机制线程线程控制死锁JAVA multithreading synchronized mechanism and applicationsAbstract Introduced the concept of the JAVA Thread analyze a multi-threading and the synchronized mechanism Give establish the Thread of two kinds of methods inherit Thread and realize runnable interface and its basic format To five kinds of state in the Thread a few basic method of the control of the Thread start stop sleep etc the Thread attemper PRImake concrete introduction With a concrete example to explain a little bit existent problems of multi-threadings give the concrete contents of synchronized mechanism two kinds of basic realizations are synchronized method and the basic format of the synchronized key word and the synchronzied method Discussed two kinds of problems of JAVA synchronized mechanism False synchronized and deadlock and give understand the suggestion of these two kinds of problems definitely Introduced a kind of method for multi-threading communications Wait notify method and the main format of that method the application and notice with application of item Application passed a solid example of concrete comprehensive application explained a multi-threading Application in physicallyKeyword multi-threadingsynchronized mechanismThreadThread controldeadlock前言许多应用程序都可能存在对并发性的要求例如一个图形用户界面的应用程序希望在处理长时间任务的同时仍能快速相应用户的鼠标或键盘事件一个在因特网上运行的服务程序希望能同时处理大量的客户请求多线程multithreading为程序员处理程序中的并发性提供了强有力的工具1线程进程为应用程序的运行实例是应用程序的一次动态执行线程是进程中某个单一顺序的控制流也是Java中的相当重要的组成部分之一甚至最简单的Applet也是由多个线程来完成的在Java中任何一个Applet的paint 和update 方法都是由AWT绘图与事件处理线程调用的而Applet主要的方法init start stop 和destory 是由执行该Applet的应用调用的是由于它运行于整个程序的上下文内能使用整个程序共有的资源和程序环境多线程是这样一种机制它允许在程序中并发执行多个指令流每个指令流都称为一个线程彼此间互相独立进程一样拥有独立的执行控制由操作系统负责调度区别在于线程没有独立的存储空间而是和所属进程中的其它线程共享一个存储空间这使得线程间的通信远较进程简单有两个数据源最初它们的数据都是一样的若一个数据源的数据经过添加修改删除等操作发生了改变或者两个数据源的数据都发生了改变那么为了使两个数据源的数据保持一致即让一个数据源数据的改变反映到另一个上就必须进行一个让两个数据源的数据保持一致的操作这个操作就叫同步同步操作结束之后两个设备上的数据就完全一致了处于同步状态Thread 类是一个具体的类不是抽象类该类封装了线程的行为要创建一个线程必须创建一个从 Thread 类导出的新类必须覆盖 Thread 的 run 函数来完成有用的工作用户并不直接调用此函数而是必须调用 Thread 的 start 函数该函数再调用 run 下面的代码说明了它的用法Class myThread extends Thread Public void run myThread new Thread myThreadstart 实现Runnable接口实现多线程当定义了实现Runnable接口的类后它并没有实现线程的所有功能所以还需要创建一个新的线程对象使继承类具备线程功能该操作为将定义的继承类作为一个对象参数传递给Thread对象的构造方法来创建线程对象然后才可以通过调用Thread类中的start 方法来开始线程的执行格式如下Class myclass implements Runnable Public void run Myclass myyobj new myclass Thread myThread new Thewad myobj MyThreadstart 线程管理线程周期在创建线程时无论采用哪种方法都需要在该类中定义一个线程体按照线程体在内存中的状态不同可以将线程分为开始new可运行Runnable运行Running阻塞Blocked死亡Dead5种状态线程从开始到死亡的状态变化过程称为线程的周期线程控制单线程的程序都有一个主方法它运行一些代码只有当程序结束执行后它才退出程序同时结束运行在JAVA多线程中我们要得到这样的实现必须进行一些修改只有当所有的线程都退出后程序才能结束只要有一个线程在运行程序就无法退出第一次创建线程时都位于开始的状态在这个状态下不能运行线程只能等待然后线程或者由方法start 开始或者直接进入死亡状态位于死亡状态中的线程已经结束执行这也是线程周期的最后一个状态一旦线程位于这个状态就不能再次出现而且当JAVA虚拟机中的所有线程都位于死亡状态时程序就强行中止当执行的所有线程都位于可运行状态时在程序之间用某种方法把处理器的执行时间分成时间片位于可运行状态的每个线程都是能运行的但在一个定的时间内每个系统处理器只能运行一个线程与位于可运行状态的线程不同由于某种原因可以把已经位于阻塞状态的线程从一组可执行线程中删除如果线程的执行被中断就回到阻塞状态用多种方法能中断一个线程线程能被挂起等待系统释放资源或者被告知进入休眠状态该状态的线程可以返回到可运行状态也能由方法stop 送入死亡状态9表1描述了Therad类提供的一些主要的控制线程的方法及作用表1 Therad类的主要方法方法描述有效状态f目的状态Start 开始执行一个线程开始可运行Stop 结束执行一个线程开始运行可运行结束Sleep long 暂停一段时间这个时间为给定的毫秒可运行f阻塞Sleep longint 暂停片刻可以精确到纳秒可运行阻塞Suspend 挂起执行可运行阻塞Resume 恢复执行阻塞可运行Yield 明确放弃执行运行可运行线程的调度线程调用的JVM对运行的多个线程进行系统级的协调以避免多个线程争用有限资源而导致系统死机或者崩溃为了操作系统和用户Java定义了线程的优先级策略Java将线程的优先级分为10个等级分别用1-10之间的数字表示数字越大表明线程的级别越高相应地在Thread类中定义了表示线程最低最高和优先级的成员变量MIN_PRIORITY_PRIORITY和NORMAL_PRIORITY代表的优先级等级分别为110和5当一个线程对象被创建时其默认的线程优先级是5为了控制线程的运行Java定义了线程调度器来监控系统中处于就绪状态的线程线程调度器按照线程的优先级决定那个线程投入处理器运行在多个线程处于就绪状态的条件下具有高优先级的线程会低优先级线程得到执行线程调度器同样采用抢占式策略来调度线程执行即当前线程执行过程中有较高优先级的线程进入就绪状态则高优先级的线程立即被调度执行具有相同优先级的所有线程采用轮转的方式在应用程序中设置线程优先级的方法很简单在创建线程对象之后可以调用线程对象的setPriority方法改变该线程的运行优先级同样可以调用getPriority方法获取当前线程的优先级 在Java中比较特殊的线程是被称为守护Daemon线程的低级别线程这个线程具有最低的优先级用于为系统中的其它对象和线程提供服务将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法JVM中的系统资源自动回收线程它始终在低级别的状态中运行用于实时监控和管理系统中的可回收资源class Synchronized001 public static void main String args AccInfo ft new AccInfo ActionThread tt1 new ActionThread ft Deposit Thread ActionThread tt2 new ActionThread ft Withdrawal Thread tt1start tt2start class AccInfo public static String Action public static double Balance class ActionThread extends Thread private AccInfo ft ActionThread AccInfo ft String name super name 保存线程名称 thisft ft 保存对事务对象的引用 public void run ftBalance 2000 Sycomtln 此帐户余额2000元 for int i 0 i 20 i if getName equals Deposit Thread 存款线程关键代码部份的开始 ftAction 存款 try Threadsleep int Mathrandom 1000 动作延迟 随机数 catch InterruptedException e ftBalance 1000 此帐户存入100元 Sycomtln ftAction 100元 此帐户余额 ftBalance 元 存款线程关键代码部份的结束 else 取款线程关键代码部份的开始 ftAction 取款 try Threadsleep int Mathrandom 1000 动作延迟 随机数 catch InterruptedException e if ftBalance 1500 ftBalance - 1500 此帐户取出150元 Sycomtln ftAction 150元 此帐户余额 ftBalance 元 else Sycomtln 余额不足 取款线程关键代码部份的结束 Synchronized001的代码有两个关键部份一个为存款线程另一个为取款线程在存款线程关键代码部份中线程分配对象的引用给共享变量Action 及分配 给共享变量同样在取款关键代码部份线程分配对象的引用给Action及分配500给在每个线程的分配之后那些变量的内容当运行Synchronized001时输出类似于0元和 200元的信息相反到的输出如下所示程序明显有问题取款线程不应该的取款存款线程不应该的存款每一个线程产生不一致在一个单处理器机器上线程共享处理器结果一个线程仅能执行一定时间段在其它时间里 操作系统暂停那个线程的执行并允许其它线程执行在一个多处理器机器上依靠线程和处理器的数目每一个线程都能拥有它自己的处理器在一单处理器机器上一个线程的执行时间段没有足够长到在其它线程开始执行的关键代码部份前完成它自己的关键代码部分在一个多处理器机器上线程能够同时执行它们自己的关键代码部份然而它们可能在不同的时间进入它们的关键代码部份无论是单处理器或是多处理器机器下面的线程A在它的关键代码部份分配一个值给共享变量X并决定执行一个要求100毫秒的输入输出操作接下来线程B进入它的关键代码部份分配一个不同的值给X执行一个50毫秒的输入输出操作并分配值给共享变量Y 和Z线程A的输入输出操作完成并分配它自己的值给Y和ZX包含一个B分配的值然而Y和Z包含A分配的值这结果Synchronized001中这个情况可能是这样发生的在最开始启动线程后假设存款线程执行ft 存款并且接下来调用Threadsleep 在那一点存款线程交出处理器控制一段时间进行休眠让取款线程执行假定存款线程休眠500毫秒Mathrandom 从0到999毫秒范围随机选取一个值在存款线程休眠期间取款线程执行ft 取款休眠毫秒 取款线程随机选取休眠值 执行ft 1000并执行结果是正确的ftAction 存款然后执行Threadsleep 进入休眠这过程中款线程醒来执行ft 1500接下来执行线程的执行顺序是不可知的这里不能保证一个线程能够在其它线程进入关键代码部份前完成它自己的关键代码部份要每一个线程必须在其它线程进入同一关键代码部份或其它操作同一共享变量或资源的相关关键代码部份前完成它自己的关键代码部份对于一个关键代码部份没有访问方法即在一个时间只允许访问一个线程Java提供一个同步机制以阻止多线程在时间的任意一点在一个或多个关键代码部份执行代码这种机制将自己建立在监视器和锁的概念基础上一个监视器被作为包在关键代码部份周围的保护一个锁被作为监视器用来防止多重线程进入监视器的一个软件实体其当一个线程想进入一个监视器监视着的关键代码部份时那个线程必须获得一个与监视器相关的对象的锁 每个对象都有它自己的锁 如果一些其它线程保存着这个锁 JVM会强迫请求线程在一个与监视器锁有关的等待区域等待当监视器中的线程释放锁时 JVM从监视器的等待区域中移出等待线程并允许那个线程获得锁且处理监视器的关键代码部份要和监视器锁一起工作 JVM提供了monitorenter和monitorexit 指令不需要你synchronized关键字来在JAVA中实现同步9Synchronized this 这两种格式效果相同从一个代码观点看一个线程企图进入synchronized声明保护的代码部份在内部 JVM 检查是否一些其它线程控制着与对象相关的锁如果没有其它线程控制着锁 JVM将锁给请求线程并允许那个线程进入花之间的关键代码部份然而如果有其它线程控制着锁 JVM会强迫请求线程在一个私有等待区域等待直到在关键代码部份内的当前线程完成执行最后声明及经过最后的花Synchronized001的修改主要是在线程类ActionThread的run方法中使用了synchronized关键字class ActionThread extends Thread public void run if getName equals Deposit Thread synchronized ft else synchronized ft 在加了synchronized以后run 方法包含两个夹在synchronized ft and 间的关键代码部份每个存款和取款线程必须在任一线程进入它的关键代码部份前获得与ft引用的AccInfo对象相关的锁假如如果存款线程在它的关键代码部份且取款线程想进入它自己的关键代码部份取款线程就应获得锁因为当存款线程在它的关键代码部份执行时控制着锁 JVM 便强迫取款线程等待直到存款线程执行完关键代码部份并释放锁当执行离开关键代码部份时锁自动释放 程序使用synchronized声明过多的声明代码效率低例如假设程序包含一个带两个连续synchronized声明的方法每一个声明都企图获得同一公共对象的锁因为获得和翻译对象的锁要消耗重复调用在一个循环中方法会降低程序的性能每次对那个方法的一个调用都必须获得和释放两个锁程序花费大量的时间获得释放锁要这个问题考虑使用方法一个同步方法不是一个实例就是一个其头包含synchronized关键字的类方法例如 synchronized void print String s 当你同步一个完整实例方法时一个线程必须获得与那个方法调用出现的对象相关的锁例如给一个ftupdate 1000 实例方法调用并且假定update 是同步的一个方法必须获得与ft引用的对象相关的锁class AccInfo synchronized void update String Action double Balance Boolean Flag class ActionThread extends Thread public void run ftupdate 可以看出虽然第二种方法虽然比第一种方法简化一些但是它们的运行结果是一致的这说明它们虽然实现同步的方法不同但是效果都是一样的同步机制的问题 1 不同步在一个线程自动或不自动退出一代码部份时它释放一个锁以便另一个线程能够得以进入假设两个线程想进入同一代码部份为了阻止两个线程同时进入代码部份每个线程必须努力获得同一个锁如果个线程获得一个不同的锁并成功了两个线程都进入代码部份最终结果是没有同步Synchronized001为例修改类ActionThread的run方法public void run synchronized this synchronized this 运行后我们可以看出尽管使用了synchronized声明但synchronized this 因为关键字this指向当前对象存款线程企图获得与初始化分配给tt1的ActionThread对象引用有关的锁类似的取款线程企图获得与初始化分配给tt2的ActionThread对象引用有关的锁我们有两个不同的ActionThread对象并且每一个线程企图在进入它自己代码部份前获得与其各自ActionThread对象相关的锁因为线程获得锁两个线程都能在同一时间进入它们自己的代码部份结果是没有同步选择一个对于所有相关线程都公有的对象那样的话这些线程获得同一个对象的锁同一时间仅有一个线程在能够进入相关的关键代码部份class ActionThread extends Thread private AccInfo ft private static String Lock public void run if getName equals Deposit Thread synchronized ft synchronized Lock else synchronized Lock synchronized ft 程序执行后我们发现此程序不会结束而是停在了某一个代码段查看一下代码存款线程必须在它能够进入其内部关键代码部份前获得两个锁与ft引用的AccInfo对象有关的外部锁和与引用的String对象有关的内部锁类似的取款线程必须在其能够进入它自己的内部关键代码部份前获得两个锁与Lock引用的String对象有关的外部锁和与ft引用的AccInfo对象有关的内部锁假定两个线程的执行命令是每个线程获得它的外部锁因此存款线程获得它的AccInfo锁以及取款线程获得它的String锁现在两个线程都执行它们的外部锁它们处在它们相应的外部关键代码部份两个线程接下来企图获得内部锁因此它们能够进入相应的内部关键代码部份 存款线程企图获得与Lock引用对象相关的锁然而因为取款线程控制着锁所以存款线程必须等待类似的取款线程企图获得与ft引用对象相关的锁但是取款线程不能获得那个锁因为存款线程控制着它因此取款线程也必须等待两个线程都不能操作因为两个线程都不能释放它控制着的锁死锁程序冻结为了避免死锁仔细分析代码同步方法调用其它同步方法地方可能出现线程互相获得彼此的锁因为JVM探测并防止死锁Public final native void wait long timeout throw InterruptedExceptionPublic final void wait long timeoutint nanos throws InterruptedException Public final void wait throw InterruptedException Public final native void notify Public final native void notifyAll 这些方法定义载类Object中表明上述行为是所有对象的基本语义任何一个对象都具有执行这些操作的能力由于wait 和notify notifyAll 方法需要在持有对象实例的锁时方可调用故这些方法必须放在以synchronized标识的同步代码段中否则运行时将抛出一个comgalMonitorStateException异常异常中的反馈信息为current thread not owner此外由于wait 产生的阻塞状态可由interrupt 方法中断wait 方法的调用通常放在一个try catch块中以捕获并处理InterruptedException异常基于wait 和notify notifyAll 方法的线程间通信主要通过双方可共享的某一条件实现如果一个线程检测到条件不成立则调用wait 方法进入等候队列如果另一个线程执行了可能改变条件的操作则调用notify notifyAll 方法唤醒在队列中等候的一个或多个线程重新投入运行并检查条件是否成立当然这些线程必须约定同一个对象实例以执行wait 和notify 方法下面是一种典型的wait 方法调用格式Synchronized obj While 条件不成立 try objwait catch InterruptedException e 而典型的notify notifyAll 方法调用格式如下Synchronized obj Objnotify 在一般情况下wait 方法应该放在一个循环语句中如果仅将wait 方法放在一个条件语句中可能会给多线程应用程序带来隐患因为在线程被notify notifyAll 方法唤醒后可能会有其他线程抢先占用锁并又改变了条件交通灯管理系统由于JAVA语言本身是基于面向对象的思想而多线程的引入又大大提高了代码执行的效率所以说JAVA在多线程方面的应用及其广泛从一般的单机程序到网络服务器都可以使用JAVA多线程方式来完成而且效率也是非常高这里我们利用JAVA多线程技术设计实现了一个交通灯管理系统设计方法交通灯管理系统要完成对一个对十字路口的车流量进行分析然后调节南北或东西方向的红绿灯变换的时间来进行简单的交通控制首先要实现两个不同方向的交通灯线程在这两个线程中要包括红绿灯变换的控制方法然后就是两个不同方向的车流量监视的线程最后要通过一个控制线程分析车流量来进行全局的时间调节和功能的控制具体的关系如图1所示图1 控制线程图1中南北方向车流量监控线程和东西方向车流量监控线程把得到的车流量数据交给控制线程控制线程通过对车流量进行分析发送控制信息给东西和南北两个方向的交通灯线程以控制这两个方向的红绿灯变换具体实现通过绘图先绘制出交通灯的界面然后就是按照图1的关系来进行线程的程序代码编写在编写代码时我们会发现在车流量监控线程时如果南北方向和东西方向同时通过一个模拟的车流量统计方法取车流量的数据那么有可能导致两个方向取得的车流量数据相同既有一个方向取得错误的数据为了避免这种错误在编写模拟的车流量数据方法的代码段时使用synchronized方法来进行同步当东西方向车流量监控线程通过模拟的车流量数据取数据时南北方向车流量监控线程不能对该方法进行操作只有东西方向的线程取数据完毕南北方向的线程才能对数据进行操作交通灯的线程中有红绿灯变换的方法当现在显示的是红灯时读秒到时后直接变换为绿灯如果现在显示的是绿灯读秒快结束时绿灯闪烁3次后熄灭然后亮黄灯2秒最后亮红灯黄灯熄灭主要功能及类介绍该程序是一个较简单的交通灯管理程序可以通过定时对两个模拟的车流量数据统计线程的控制实现模糊的红绿灯变换管理在程序中可以通过手动改变车流量使得程序自动增加或减少相应路口的红灯时间也可以手动设定红绿灯的时间和车流量统计监视器的周期该程序中一共有四个主要的类TrafficLightThreadCarMonitorMonitorCarFluxTrafficLightThread和CarMonitor都是实现Runnable接口的线程类CarFlux类主要是提供一个模拟交通流量数据收集的方法类TrafficLightThread中包含了主方法以及红绿灯路口绘图的方法在其Run方法中是两个不同方向的交通灯线程主要是交通灯颜色变换以及闪烁的方法当交通灯在发生变换前的4秒时由绿灯向红灯变化方向的绿灯开始闪烁其相反方向的红灯常量类CarMonitor是一个交通灯监视器的线程其工作原理是通过对两个不同方向的模拟的交通灯流量监视器线程进行周期性的数据收集然后动态的调整两个方向的红绿灯时间达到缓解交通堵塞的目的类Monitor是模拟的两个路口方向的监视器线程其功能就是从CarFlux类中读取一个随机数来模拟统计两个方向的车流量CaiFlux类就是提供一个随机数的方法getRa 此方法采用了synchronized方法这是为了防止在两个不同方向监视器线程同时运行getRa 方法获得相同的数值从而导致交通灯流量统计的错误具体程序运行效果如图2所示图2 接通控制运行效果图结束语线程相对于进程而言是一种轻量级的计算任务多线程的应用包括提高交互式应用程序的响应性和提高服务端程序的性能Java线程机制建立在本地平台的线程库基础上创建一个java线程有两种途径继承thread类实现runnable接口每一个线程都有其生存期线程的可运行状态与运行状态之间的切换由JVM线程调度程序负责程序员yield 方法主动放弃cpu时间通过synchronized标识的代码段和wait notify 机制可以解决多个线程的同步问题线程优先级用于影响调度程序对线程的选择程序员可以通过设置优先级使重要的任务优先执行守护线程是一类特殊的线程JVM并不将守护现成视做一个应用程序的和核心部分致谢月的设计的知识多许多书本上学不到的知识但最重要得一点就是从老师那里学到了学习的方法和分析问题的方法学习知识是要学习方法才是立身之本本次设计能够顺利的完成首先应该衷心感谢老师指导在我的这次毕业设计中也给了我很大帮助的参考文献 周晓聪李文军李师贤 面向对象程序设计与JAVA语言M北京机械工业出版社20042 Cay S HorstmannGary Cornell 最Java 2核心技术机械工业出版社20033 Bruce Eckel Think in JavaM北京机械工业出版社20024 宋中山严千钧等 JAVA程序设计M北京清华大学出版社20055 张敬李晓明陈晨 基于Java线程同步的实现黑龙江高师理科学刊200538-156 Paul Hyde Java线程编程北京人民邮电出版2003 7 B LewisD J Berg JAVA多线程编程电子工业出版社2000Scott OaksHenry Wong Java线程中国电力出版社2003蒋峰 Java多线程编程中线程生存期和优先级的探讨 吉林计算机工程与设计200437 5 131-13310 连凤春 Java语言中的多线程北京电脑知识与技术20045 2 13-1611 李金铭林晓宇宁正元面向对象程序设计JavaM北京清华大学出版社2005张培晶杨社堂 Java多线程同步机制平台相关性浅析科技情报开发与经济2005137 1 227-22913 Robin M Roos Java数据对象北京人民邮电出版社2004 Douglas A Lyon Java程序员指南北京清华大学出版社2005刘宝林Java程序设计与案例北京高等教育出版社2004附 录交通灯管理程序代码import javaawtclass TrafficLightThread extends Canvas implements Runnable int TimeWER 30 WE方向红灯时间 int TimeWEG 30 WE方向绿灯时间 int Time 临时时间变量 String s 显示红绿灯标签 boolean FlagRed true 是否是红灯的标志 boolean Pos true boolean BE true Color ReColor Colorred 红色 Color GrColor Colorgreen 绿色 Color YeColor Coloryellow 黄色 Color WhColor Colorgray 灰白色 Color NowWEColorY 现在黄灯位置的颜色 Color NowWEColorR 现在红灯位置的颜色 Color NowWEColorG 现在绿灯位置的颜色 TextField TimeWE new TextField 1 public TrafficLightThread Color What boolean WEPos 初始化颜色位置 if WEPos false 如果不是WE方向 s 南北方向 else s 东西方向 Pos WEPos NowWEColorR WhColor NowWEColorG WhColor NowWEColorY WhColor setSize 300 300 初始化画板大小setBackground Colorblack 初始化背景色if What ReColor 判断初始化时的颜色 NowWEColorR ReColor else NowWEColorG GrColor public void paint Graphics g 重载canvas的绘图方法 gsetColor Colorwhite if FlagRed 如果现在红灯亮起显示红灯时间 gsetColor ReColor gdrawString s 红灯剩余时间 IntegertoString Time 50 50 else 如果现在红灯不亮则显示绿灯时间 gsetColor GrColor gdrawString s 绿灯剩余时间 IntegertoString Time 50 50 gsetColor Colorgray 设置颜色为灰白色 gfillRect 0 150 300 30 画矩形框 gfillRect -30 0 30 300 gfillRect 270 0 30 300 gsetColor NowWEColorG gfillOval 2 98 50 50 画绿灯 gsetColor NowWEColorY gfillOval 54 98 50 50 画黄灯 gsetColor NowWEColorR gfillOval 106 98 50 50 画红灯 public void Changed 灯色变换方法 NowWEColorY WhColor 熄黄灯if NowWEColorG GrColor 如果绿灯亮起 NowWEColorG WhColor 熄绿灯 NowWEColorR ReColor 亮红灯 else NowWEColorR WhColor 否则熄红灯 NowWEColorG GrColor 亮绿灯 public void run 线程的运行方法 try if Pos false 如果不是WE方向则交换红绿灯时间 Time TimeWER TimeWER TimeWEG TimeWEG Time while BE if NowWEColorR ReColor 红灯是否亮起 FlagRed true 是则红灯亮起标记为真 else FlagRed false 否则为假 if FlagRed 如果是红灯亮起 Time TimeWER 现在显示时间为红灯持续时间 while Time 1 当时间大于0秒时 Time- 时间数减1秒 repaint Threadsleep 1000 暂停1秒 end While Changed 红绿灯变换 repaint 刷新显示 else 如果是绿灯亮起 Time TimeWEG 现在显示时间为绿灯持续时间 while Time 1 当时间大于0秒时 Time- 时间数减1秒 if Time 7 当时间小于5秒时 if FlagRed false 检查红灯是否亮起 if Time 2 1 当绿灯亮起并且现在时间为奇数时 NowWEColorG GrColor 绿灯亮 else NowWEColorG WhColor 现在时间为偶数时绿灯熄灭 if Time 2 当时间等于1秒时黄灯开始亮起 NowWEColorG WhColor NowWEColorY YeColor endIF endIF repaint Threadsleep 1000 暂停1秒 endWhile Changed 红绿灯变换 repaint 刷新显示 endIF endWhile catch Exception x Sycomtln x public static void main String args 主方法 new CarMonitor run import javaawtimport comtclass CarMonitor extends Frame implements Runnable 继承Frame的CarMonitor int SleepTime 10000 默认监视器周期10秒 Button b1 new Button 修改 定义按钮 Button b2 new Button 东西车流量较大 B

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论