java多线程编程制作电子时钟

 更新时间:2015年11月20日 08:51:50   投稿:hebedich  
本文给大家汇总了几个使用java多线程编程实现的电子时钟的代码,思路非常的巧妙,也都很实用,有需要的小伙伴可以参考下。

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

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

class Clock extends Label implements Runnable
{
  //定义Thread类型的clocker域
  public Thread clocker=null;
  public Clock()
  {
    
    //初始化时,把label设置为当前系统时间
    //调用toString方法转化为String类型
    setText(new Date().toString());
  }
  //控制线程的启动
  public void start()
  {
    if(clocker==null)
    {
      //clocker通过Thread类构造方法得到的对象进行初始化,并将Clock类的当前对象作为参数
      clocker=new Thread(this);
      clocker.start();
    }

  }
  //控制线程的停止
  public void stop()
  {
    clocker=null;
  }
  //实现Runnable接口中的run()方法
  public void run()
  {
    Thread currentThread=Thread.currentThread();
    //判断clocker是否是当前运行的线程
    while(clocker==currentThread)
    {
            setText(new Date().toString());
            try
           {   //休眠1s钟
               clocker.sleep(1000);
      }
      catch (InterruptedException ie)
      {
        System.out.println("Thread error:"+ie);
      }
    }
  
  }

}

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

public class ClockFrame extends Frame implements ActionListener
{
  private Button start=new Button("Start");
  private Button stop=new Button("Stop");
  private Clock c=new Clock();
  public ClockFrame()
  {
    super("电子时钟");
    //设置窗体使用流式布局
    setLayout(new FlowLayout());
    //添加按钮并且为其注册监听器
    add(start);
    start.addActionListener(this);
    add(stop);
    stop.addActionListener(this);
    //使用继承WindowAdapter的匿名内部类来实现窗口的关闭
    addWindowListener(new WindowAdapter()
    {
      public void windowClosing(WindowEvent we)
      {System.exit(0);}
    });
    add(c);
    //使构件在窗口中得到合理的安排。
    pack();
    setVisible(true);


  }
  //通过调用Clock对象中的方法,实现对事件的响应。
  public void actionPerformed(ActionEvent ae)
  {
    if(ae.getSource()==start)
    {
      c.start();
    }
    else
      if(ae.getSource()==stop)
      c.stop();

  }
  public static void main(String[] args)
  {
    new ClockFrame();
  }
}

3、运行:

注:

需要导入的类:

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

再给大家一个网友的做法,非常不错

import java.awt.*;  
import javax.swing.*;  
import java.util.Date;  
 
/*TimeDemo.java 
 * @src 
public class TimeDemo extends JFrame implements Runnable {  
 
  Thread clock;  
    
  public static void main(String[] args) {  
  TimeDemo td =new TimeDemo();  
  td.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //点击可见窗口右上角的红叉关闭  
   }  
    
  public TimeDemo(){  
   super("雪地漫步---java多线程数字时钟"); //继承父类构造方法,这里相当于Font("雪地漫步---java多线程数字时钟");  
setTitle("kk");  //这个则是子类的  
   this.setFont(new Font("Times New Roman",Font.BOLD,60));  //设置字体大小  
   this.go();    //自定义go方法,用于以后开启线程  
   setBounds(400,300,300,100);  
   this.setVisible(true);  
  }  
 
   public void go(){  
  stop();  
   if(clock==null){  
  //线程执行的主题作为Thread类构造方法的参数。  
   clock=new Thread(this);  
   clock.start();     //开启线程,实现run方法  
  }  
}  
 
  public void run() {  
    while(true)   //让线程一直进行  
  {  
//repain()方法是来控制Graphics类的paint()方法的,repain()方法执行一次,即让paint()方法执行一次  
      repaint();   
     try{  
      Thread.sleep(1000);   //参数是毫秒,1秒即1000毫秒  
     }catch(InterruptedException e){}  
    }  
   }  
 
  public void stop(){  
   clock=null;  
  }  
 
  public void paint(Graphics g){  
   String s="";  
   Date now=new Date();  
   int hour=now.getHours();                       
   int minute=now.getMinutes();  
   int second=now.getSeconds();  
   s=hour+":"+minute+":"+second;  
   g.setColor(Color.green);  
   Dimension dim=getSize();  
   g.fillRect(0, 0, dim.width, dim.height);  
   g.setColor(Color.red);  
   g.drawString(s, 20, 80);  
  }  
} 

例子三:思路更加的巧妙,分享给大家

import java.awt.BorderLayout;
 import java.awt.Canvas;
 import java.awt.Color;
 import java.awt.Font;
 import java.awt.Graphics;
 import java.sql.Date;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 class Clock extends Canvas implements Runnable{

   /*
   http://ohgrateboy.blog.163.com我的博客
   */

   private static final long serialVersionUID = 3660124045489727166L;
   Thread t;
   JFrame frame=new JFrame();
   JPanel conPane;
   String time;
   int i=0;
   Date timer;
   public Clock(){
     conPane=(JPanel)frame.getContentPane();
     conPane.setLayout(new BorderLayout());
     conPane.setSize(280,40);
     conPane.setBackground(Color.white);
     conPane.add(this,BorderLayout.CENTER);
     t=new Thread(this);        //实例化线
    t.start();    //调用线程
    
     frame.setVisible(true);
     frame.setSize(300, 150);
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }

   public void run(){

     while(true){

     try{

       Thread.sleep(1000);          //休眠1秒钟

    }catch(InterruptedException e){

       System.out.println("异常");
     }
     this.repaint(100);

   }

   }

   public void paint(Graphics g){

     Font f=new Font("宋体",Font.BOLD,16);

     SimpleDateFormat SDF=new SimpleDateFormat("yyyy'年'MM'月'dd'日'HH:mm:ss");//格式化时间显示类型
    Calendar now=Calendar.getInstance();

     time=SDF.format(now.getTime());    //得到当前日期和时间
    g.setFont(f);

     g.setColor(Color.orange);

     g.drawString(time,45,25);

   }
   public static void main(String args[]){
     new Clock();
   }

 } 

相关文章

  • Java并发 synchronized锁住的内容解析

    Java并发 synchronized锁住的内容解析

    这篇文章主要介绍了Java并发 synchronized锁住的内容解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • idea创建spring boot项目及java版本只能选择17和21的问题

    idea创建spring boot项目及java版本只能选择17和21的问题

    这篇文章主要介绍了idea创建spring boot项目及java版本只能选择17和21的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • Java非递归实现删除任意目录的方法

    Java非递归实现删除任意目录的方法

    这篇文章主要为大家详细介绍了Java非递归实现删除任意目录的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Java8中的Stream流式操作教程之王者归来

    Java8中的Stream流式操作教程之王者归来

    这篇文章主要给大家介绍了关于Java8中Stream流式操作的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java8具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • Java ThreadLocal类使用详解

    Java ThreadLocal类使用详解

    这篇文章主要介绍了Java ThreadLocal类详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • java将html转成图片代码实例(html2image)

    java将html转成图片代码实例(html2image)

    这篇文章主要介绍了java将html转成图片的相关资料,在Java开发中,将HTML转换为图片可以使用html2image库,文中通过代码及图文介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • java web在高并发和分布式下实现订单号生成唯一的解决方案

    java web在高并发和分布式下实现订单号生成唯一的解决方案

    这篇文章主要介绍了java web在高并发和分布式下实现订单号生成唯一的解决方案,需要的朋友可以参考下
    2017-11-11
  • SpringBoot+SpringSecurity+JWT实现系统认证与授权示例

    SpringBoot+SpringSecurity+JWT实现系统认证与授权示例

    本文主要介绍了SpringBoot+SpringSecurity+JWT实现系统认证与授权示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 解析Java异步之call future

    解析Java异步之call future

    当调用一个函数的时候,如果这个函数的执行过程是很耗时的,就必须要等待,但是有时候并不急着要这个函数返回的结果。因此,可以让被调者立即返回,让他在后台慢慢处理这个请求。对于调用者来说,可以先处理一些其他事情,在真正需要数据的时候再去尝试获得需要的数据
    2021-06-06
  • 老生常谈java中的Future模式

    老生常谈java中的Future模式

    下面小编就为大家带来一篇老生常谈java中的Future模式。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论