《任务设计考试系统中的倒计时.ppt》由会员分享,可在线阅读,更多相关《任务设计考试系统中的倒计时.ppt(24页珍藏版)》请在三一办公上搜索。
1、任务11设计考试系统中的倒计时,学习情境二(考试系统单机版),学习目标,知识目标,深入理解进程与线程的概念。掌握线程创建的方法。理解线程状态间的转换、优先级及其调度。了解线程的同步在实际中的应用。,协调能力、团队合作的能力接受新知识、自主学习的能力,多线程技术的应用,11.1 任务描述,本次任务是设计倒计时。考试系统中的倒计时功能是必不可少的功能之一,当考生成功登录考试系统后,点击【开始考试】,则计时系统开始倒计时。当考试时间结束时,系统将弹出相应的对话框提示并退出考试。如图11-1,在我们所设计的考试系统中,时间的显示在整个界面的上方,使得考生能清晰地看到时间的显示,把握好考试时间。Java
2、利用线程技术可以实现时间的动态刷新和显示,从而可以实现时间的同步显示。,11.2 技术要点,线程的创建 线程的管理,程序,进程,多线程,程序(Program)储存于外存中的可执行文件 Program进程(Process)载入内存中的可执行文件称为 Process线程(Thread)Process 中的一段程式码执行轨迹称为 Thread,是计算机中最小的执行单位。,HDD,Memory,Program,Process,Thread,线程和进程,线程和进程的主要差别体现在如下两个方面:(1)同样作为基本的执行单元,线程的划分比进程小。(2)每个进程都有一段专用的内存区域。与此相反,线程却共享内存
3、单元(包括代码和数据),通过共享的内存单元来实现数据交换、实时通信与必要的同步操作。,线程的创建,Java中提供了两种创建线程的方法扩展Thread类实现Runnable接口来创建线程。其中Thread类和Runnable接口都定义在包java.lang中。,扩展Thread类创建线程,创建和执行线程步骤,步骤一、创建一个Thread类的子类,该类必须重写Thread类的run()方法。class 类名称 extends Thread/从Thread类扩展出子类 成员变量;成员方法;public void run()/重写Thread类的run()方法 线程处理的代码 步骤二、创建该子类的对象
4、,即创建一个新的线程。创建线程对象时会自动调用Thread类定义的相关构造函数。步骤三、用构造函数创建新对象之后,这个对象中的有关数据被初始化,从而进入线程的新建状态。直到调用了该对象的strat()方法。步骤四、线程对象开始运行,并自动调用相应的run()方法。,举例ThreadDemo1.java,class MyThread extends Thread public void run()for(int i=1;i=10;i+)System.out.println(this.getName()+:+i);public class ThreadDemo1 public static voi
5、d main(String args)MyThread t=new MyThread();t.start();,举例ThreadDemo2.java,class MyThread extends Thread MyThread(String str)super(str);public void run()for(int i=1;i=5;i+)System.out.println(this.getName()+:+i);public class ThreadDemo2 public static void main(String args)MyThread t1=new MyThread(线程1
6、);MyThread t2=new MyThread(线程2);t1.start();t2.start();for(int i=1;i=5;i+)System.out.println(Thread.currentThread().getName()+:+i);,实现Runnable接口创建线程,Java提供了Runnable接口来完成创建线程的操作。在Runnable接口中,只包含一个抽象的run()方法。public interface Runnable public abstract void run()利用Runnable接口创建线程,首先定义一个实现Runnable接口的类,在该类中必
7、须定义run()方法的实现代码。class MyRunnable implements Runnable public void run()/新建线程上执行的的代码,实现Runnable接口创建线程,直接创建实现了Runnable接口的类的对象并不能生成线程对象,必须还要定义一个Thread对象,通过使用Thread类的构造函数去新建一个线程,并将实现Runnable接口的类的对象引用作为参数传递给为Thread类的构造函数,最后通过start()方法来启动新建线程。基本步骤如下:MyRunnable r=new MyRunnable();Thread t=new Thread(r);r.st
8、art;,举例RunnerDemo.java,class MyRunner implements Runnable public void run()String s=Thread.currentThread().getName();for(int i=1;i=10;i+)System.out.println(s+:+i);public class RunnerDemo public static void main(String args)MyRunner r1=new MyRunner();Thread t1=new Thread(r1,线程1);Thread t2=new Thread(
9、r1,线程2);t1.start();t2.start();for(int i=1;i=10;i+)System.out.println(main 主线程+:+i);,线程的管理,线程的状态 线程的优先级 线程的调度 线程的同步,线程的状态,线程在它的生命周期一般具有五种状态,即新建、就绪、运行、堵塞、死亡。,线程的优先级,与Thread类的中和优先级相关的三个静态常量如下:低优先级:Thread.MIN_PRIORITY,取值为1。缺省优先级:Thread.NORM_PRIORITY,取值为5。高优先级:Thread.MAX_PRIORITY,取值为10。,线程的调度,线程的同步,多个线程序
10、需要共享同一资源,如果此时不去考虑线程之间的协调性,就可能造成运行结果的错误。,举例ATMDemo1.java,class ATMDemo1 public static void main(String args)BankAccount visacard=new BankAccount();ATM 丈夫=new ATM(丈夫,visacard,200);ATM 妻子=new ATM(妻子,visacard,300);Thread t1=new Thread(丈夫);Thread t2=new Thread(妻子);System.out.println(当前帐户余额为:+visacard.get
11、money();t1.start();t2.start();class ATM implements Runnable/模拟ATM机或柜台存钱 BankAccount card;String name;long m;ATM(String n,BankAccount card,long m)this.name=n;this.card=card;this.m=m;,举例ATMDemo1.java(续),public void run()card.save(name,m);/调用方法存钱 System.out.println(name+存入+m+后,帐户余额为+card.getmoney();cla
12、ss BankAccount static long money=1000;/设置帐户中的初始金额 public void save(String s,long m)/存錢 System.out.println(s+存入+m);long tmpe=money;/获得当前帐户余额 try/模拟存钱所花费的时间 Thread.currentThread().sleep(10);catch(InterruptedException e)money=tmpe+m;/相加之后存回帐户 public long getmoney()/获得当前帐户余额 return money;,11.3 任务实施(模仿实践
13、),11.3 任务实施(模仿实践),例11-7 TestClock.javaimport java.text.NumberFormat;import java.awt.event.*;import javax.swing.*;public class TestClock implements ActionListener JFrame jf;JButton begin;JButton end;JButton pause;JPanel p1;JLabel clock;ClockDispaly mt;public TestClock()jf=new JFrame(倒计时);begin=new JB
14、utton(开始考试);end=new JButton(结束考试);pause=new JButton(暂停考试);p1=new JPanel();JLabel clock=new JLabel();clock.setHorizontalAlignment(JLabel.CENTER);p1.add(begin);p1.add(pause);p1.add(end);jf.add(p1,North);jf.add(clock,Center);jf.setSize(340,180);jf.setLocation(500,300);jf.setDefaultCloseOperation(JFrame
15、.EXIT_ON_CLOSE);jf.setVisible(true);mt=new ClockDispaly(clock,100);/设置考试时间位为100分钟 begin.addActionListener(this);pause.addActionListener(this);end.addActionListener(this);,public static void main(String args)TestClock test=new TestClock();public void actionPerformed(ActionEvent e)String s=e.getAction
16、Command();if(s.equals(开始考试)begin.setEnabled(false);mt.start();/启动倒计时线程 else if(s.equals(暂停考试)pause.setText(继续考试);mt.suspend();else if(s.equals(继续考试)pause.setText(暂停考试);mt.resume();,else if(s.equals(结束考试)begin.setEnabled(false);pause.setEnabled(false);end.setEnabled(false);p1.setEnabled(false);mt.sto
17、p();System.exit(0);class ClockDispaly extends Thread private JLabel lefttimer;private JLabel totaltimer;private int testtime;,public ClockDispaly(JLabel lt,int time)lefttimer=lt;testtime=time*60;public void run()NumberFormat f=NumberFormat.getInstance();/返回整数部分允许显示的最小整数位数 f.setMinimumIntegerDigits(2
18、);int h,m,s;while(testtime=0)h=testtime/3600;m=testtime%3600/60;s=testtime%60;StringBuffer sb=new StringBuffer();sb.append(考试剩余时间:+f.format(h)+:+f.format(m)+:+f.format(s);lefttimer.setText(sb.toString();try Thread.sleep(1000);catch(Exception ex)testtime=testtime-1;JOptionPane.showMessageDialog(null,t考试时间到,结束考试!);System.exit(0);,11.3 任务实施(模仿实践),