你的位置:首页 > Java教程

[Java教程]初学多线程练习1


  模拟一个电子时钟,它可以在任何时候被启动或者停止,并可以独立的运行。

1.定义一个Clock类。它继承Label类,并实现Runnable接口。这个类中有一个Thread类型的clocker域,以及start()和run()方法。在run()方法中,每隔一秒就把系统时间显示为label的文本。

 1 class Clock extends Label implements Runnable 2 { 3   //定义Thread类型的clocker域 4   public Thread clocker=null; 5   public Clock() 6   { 7      8     //初始化时,把label设置为当前系统时间 9     //调用toString方法转化为String类型10     setText(new Date().toString());11   }12   //控制线程的启动13   public void start()14   {15     if(clocker==null)16     {17       //clocker通过Thread类构造方法得到的对象进行初始化,并将Clock类的当前对象作为参数18       clocker=new Thread(this);19       clocker.start();20     }21 22   }23   //控制线程的停止24   public void stop()25   {26     clocker=null;27   }28   //实现Runnable接口中的run()方法29   public void run()30   {31     Thread currentThread=Thread.currentThread();32     //判断clocker是否是当前运行的线程33     while(clocker==currentThread)34     {35            setText(new Date().toString());36            try37            {   //休眠1s钟38                clocker.sleep(1000);39       }40       catch (InterruptedException ie)41       {42         System.out.println("Thread error:"+ie);43       }44     }45   46   }47 48 }

2.定义一个ClockFrame类。它继承Frame类,并实现ActionListener接口。在这个类中定义start和stop按钮来控制电子时钟的运行。并且这个类有一个Clock类的域,把这个Clock类对象添加到ClockFrame类中显示。

 1 public class ClockFrame extends Frame implements ActionListener 2 { 3   private Button start=new Button("Start"); 4   private Button stop=new Button("Stop"); 5   private Clock c=new Clock(); 6   public ClockFrame() 7   { 8     super("电子时钟"); 9     //设置窗体使用流式布局10     setLayout(new FlowLayout());11     //添加按钮并且为其注册监听器12     add(start);13     start.addActionListener(this);14     add(stop);15     stop.addActionListener(this);16     //使用继承WindowAdapter的匿名内部类来实现窗口的关闭17     addWindowListener(new WindowAdapter()18     {19       public void windowClosing(WindowEvent we)20       {System.exit(0);}21     });22     add(c);23     //使构件在窗口中得到合理的安排。24     pack();25     setVisible(true);26 27 28   }29   //通过调用Clock对象中的方法,实现对事件的响应。30   public void actionPerformed(ActionEvent ae)31   {32     if(ae.getSource()==start)33     {34       c.start();35     }36     else37       if(ae.getSource()==stop)38       c.stop();39 40   }41   public static void main(String[] args)42   {43     new ClockFrame();44   }45 }

3、运行:

注:

需要导入的类:

import java.awt.*;import java.awt.event.*;import java.util.Date;