妙用Java多线程机制实现多个时区时钟显示

来源 :科技致富向导 | 被引量 : 0次 | 上传用户:wdyan297
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  【摘 要】在许多公共场合下,需要提供时钟显示,如机场、火车站、汽车站、酒店等,特别是一些需要接待外宾的场所,处理显示本地区时间以外还必须显示其他时区时间。本文使用Java多线程机制实现多个时区时钟的显示。
  【关键词】类;对象;继承;接口;多线程机制
  1.问题描述
  Java多线程机制实现了异步执行环境,线程间的通信简单有效,每个线程彼此独立执行,一个程序可以同时使用多个线程来完成不同任务。依此可实现在窗口中显示北京时间、格林尼治时间、夏威夷时间和东京时区四个时区的时钟。
  2.问题实现
  定义从Jpanel控件继承生成clock类并实现Runnable接口。在其构造方法中创建线程,通过其中的pain方法画出当前时区的时钟信息。在线程的run方法中检测当前CPU上线程是否为自身并让自身线程睡眠1000个时间单位,在主类DrawingCLock的方法中创建四个clock对象并加入到主类的frame控件中,从而实现四个时区的时钟同时显示。
  3.实现程序代码
  import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  import java.util.*;
  public class DrawingClock {
  JFrame frame;
  clock panell,panel2,panel3,panel4;
  public static void main(String args[]) {
  DrawingClock dc=new DrawingClock();
  dc.go();
  }
  public void go() {
  frame=new JFrame("时钟");
  frame.getContentPane().setLayout(null);
  panell=new clock(160,150,"北京时间",0);//线程1画北京时间时钟
  frame.getContentPane().add(panell);
  panel2=new clock(400,150,"格林威治时间",-7);////线程2画北京时间时钟
  frame.getContentPane().add(panel2);
  panel3=new clock(160,450,"东京时间",1);//线程3画北京时间时钟
  frame.getContentPane().add(panel3);
  panel4 = new clock(400,450,"夏威夷时间",-10);//线程4画北京时间时钟
  frame.getContentPane().add(panel4);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setSize(600, 650);
  frame.setVisible(true);
  }
  }
  class clock extends JPanel implements Runnable {
  Thread thr1=new Thread(this);
  String text;
  int z;
  Graphics graphics;
  Date currentDate=new Date(); //获取当前日期信息
  String lastdate=currentDate.toString(); //获取当前日期信息的字符串形式
  int xcenter , ycenter; // 时钟的中心坐标值
  int radius=100;// 时钟的半径
  void drawCircle()
  {graphics.drawArc(xcenter-radius, ycenter-radius, radius*2, radius*2,0,360);
  for(int i=1;i<=12;i++)//画表盘数字
  {int x=xcenter+(int)((radius-15)*Math.sin(i*Math.PI/6));
  int y=ycenter-(int)((radius-15)*Math.cos(i*Math.PI/6));
  String str=""+i;
  graphics.drawString(str,x,y);
  }
  }
  public void paint(Graphics g) {
  graphics=g;
  g.clearRect(xcenter-radius,ycenter-radius,radius*2,radius*2);
  drawCircle();//画表盘
  int xh, yh, xm, ym, xs, ys;
  //定义变量用于存放当前的秒针、分针和时针的末端坐标值
  int s,m,h;
  currentDate= new Date(); //获取当前日期信息
  String today=text+":"; //获取当前日期信息的字符串形式   Calendar nowcal= Calendar.getInstance();
  s=nowcal.get(Calendar.SECOND);//获取当前的秒值
  m=nowcal.get(Calendar.MINUTE);//获取当前的分钟值
  h=nowcal.get(Calendar.HOUR);//获取当前的小时值
  h+=z;
  nowcal.set(Calendar.HOUR,h);
  today+=nowcal.getTime().toString();
  //获取当前秒针、分针和时针的末端坐标值
  xs=(int) (Math.cos(s * Math.PI / 30 - Math.PI / 2) *(radius-10) + xcenter);
  ys=(int) (Math.sin(s * Math.PI / 30 - Math.PI / 2) *(radius-10) + ycenter);
  xm=(int) (Math.cos(m * Math.PI / 30 - Math.PI / 2) * (radius-40) + xcenter);
  ym=(int) (Math.sin(m * Math.PI / 30 - Math.PI / 2) * (radius-40) + ycenter);
  xh=(int) (Math.cos((h*30+m/2) * Math.PI / 180 - Math.PI / 2) * (radius-60)+ xcenter);
  yh=(int) (Math.sin((h*30+m/2) * Math.PI / 180 - Math.PI / 2) * (radius-60)+ ycenter);
  //清除界面,显示日期信息,并画秒针、分针和时针
  g.clearRect(xcenter-100, ycenter+radius+2,200,30);
  g.drawString(today, xcenter-100, ycenter+radius+20);
  g.drawLine(xcenter, ycenter, xs, ys);
  g.drawLine(xcenter, ycenter, xm, ym);
  g.drawLine(xcenter, ycenter, xh, yh);
  }
  public void run() {
  Thread me = Thread.currentThread();
  while ((thr1== me)) {//若是本线程则休眠1000个单位后刷新
  try {
  Thread.currentThread().sleep(1000);//当前线程休眠1秒
  } catch (InterruptedException e) {
  }
  repaint();//重画时钟
  }
  }
  public clock(int x,int y,String s,int zone)
  {
  z=zone;
  text=s;
  xcenter=x;
  ycenter=y;
  setSize(600,800);
  thr1.start();//启动线程
  }
  }
  4.结语
  本程序能准确显示四个时区的时间信息,但界面美观程度不够。可以利用Java的相关技术对时钟界面进行修改,使显示效果更好。
  【参考文献】
  [1]彭正文主编.Java程序设计.中国铁道出版社.
  [2]谭浩强主编.Java程序设计.清华大学出版社.
  [3]http://java.sun.com/index.jsp.
其他文献
本文主要针对目前痕迹识别中采集的具有背景杂质的灰度位图(.bmp),通过离散区域与连通区域的数目统计,然后不同灰度级区域进行标识,设计出了两种更为优化的灰度位图(.bmp)背景杂质剔出的算法,并提出了两种算法整合使用的设计思路,算法实现了更高效高准确性的图像结果 ,在痕迹识别系统、人脸识别系统等应用领域中大大提高了整体程序的运算速度、更高效更准确的剔除图像背景杂质,得到最优化的图像结果。
本文介绍了计算机应用基础课程的教学内容,分析了目前我国这一课程教学的现状以及存在的问题,并且提出了一些解决问题的措施。希望结合我校实际教学情况,能够不断提高这一课程的教学水平,培养出祖国真正需要的消防人才。
健康护理专家系统作为远程医疗的一种可行性方式,逐渐成为研究的热点。本文介绍了智能小区健康护理专家系统的架构和总体结构设计,通过推理算法对用户输入的身体数据与知识库事实匹配,并根据"加权求和"的数学模型进行模糊推理,得出用户身体状况的分析结果 ,给出相应的预防测试和生活建议。
信息素养是人们在信息化社会中必备的基本素质,但现有的信息素养教育存在很多问题。在阐述了国内外对整合教育模式的研究现状之后,给出了整合教育模式的具体内容,以及今后应该着重讨论的三个方面。
本文围绕如何提高虚拟环境中物体运动的真实性和实时性,对虚拟环境中的物体进行了预处理,并从相交测试复杂度、紧密性角度对几种常见的包围盒进行了比较,在分析轴对齐包围盒(AABB)树生成基础上,从存储空间的角度对AABB包围盒树的节点进行了存储优化和AABB包围盒树结构的优化,改进后显著提高了碰撞检测的速度,增强了系统的实时性。
随着现代教育技术发展的不断深入,教学资源建设的理念发生了重大变革。校本教学资源建设的过程,不再是资料收集、整理、确定的过程,而是教师间知识交流的过程,是基于WEB以校园网络为基础的,知识管理的过程。本文从知识管理的角度分析了普通中学校本教学资源的网络化组织理念和基于WEB的校本教学资源平台的设计过程。
入侵检测技术作为一种积极主动的安全防护手段,在保护计算机网络和信息安全中起到了越来越大的作用。数据挖掘通过从大型数据集抽取知识能够保证入侵检测技术异常检测有更高的准确率,并能够让误用检测中的已知行为模式的规则定义更加合理。本文选取了K-means算法作为例子,重点探讨了其算法本身的优缺点,对算法进行了改善,并对如何运用在入侵检测技术上做出了一定的说明,对入侵检测系统的改进提出了自己的见解。
当今物联网信息渗透于人们生产和生活的各个方面,极大地改变了人们的生产、生活方式,促进了社会经济的快速发展。安全性问题对物联网的快速发展至关重要,本文在探讨物联网架构的基础上,研究物联网安全的关键技术,从而为建立物联网的安全体系提供依据。
云存储技术是计算机发展过程中的一项重要技术,其中数字迁移是从完全虚拟化的场景中走出来实现高度动态存储的必然条件,因此就必须对计算机云存储数据迁移进行详细的研究。
本文将物理层认证技术应用于智能电表系统中,物理层消息身份认证方案利用物理层信道响应的时空唯一性,进行发送信息的认证,其可利用物理层的同步头作为消息认证的信道响应提前源,避免了额外的开销和上层的复杂计算,同时物理层消息身份认证方案同传统的消息身份认证机制结合,在实现快速认证的同时最小化包传输开销,通过在IEEE802.15.4g标准下的分析和仿真,验证我们提出的方案可以满足智能电表实时控制的要求。