深度讲解Java多线程开发—电子表项目实现

简介:

 

目录

1、前端界面的设计

2、添加控件的事件监听

3、通过主线程对时间实时显示

4、启用线程实现对时间的修改

5、线程同步实现秒表功能

6、运行并进行调试


Hello,大家好,我是灰小猿!

今天和大家分享一个使用Java多线程开发的电子表项目,可以实现电子表中时间的实时显示,修改以及秒表的功能。

Java电子表设计的设计顺序为从前端界面到后端类及线程的设计,之后将前后端相结合而成。以下是电子表的开发过程:

 

1、前端界面的设计

电子表的前端界面设计依据JFrame窗体和Container容器,采用绝对定位的方法对时间显示、时间修改、秒表显示等控件进行合理布局设计,力求界面美观简洁。

image.gif编辑

2、添加控件的事件监听

在进行界面设计完成之后进行的工作是对相应的控件添加函数监听,在这里调用的是ActionListener接口,并且重写其中的actionPerformed方法,在其中对“确认修改”、“启动秒表”、“暂停”这三个按钮添加监听,并且在相应的监听中添加事件,以至于在点击按钮时候可以触发相应的事件。以下是对actionPerformed方法的重写

@Override
  public void actionPerformed(ActionEvent e) {
    // 如果点击了确认修改按钮
    if (e.getSource() == amend_JB) {
      //获取到下拉框的值
      String hour_amend = hourAmend.getSelectedItem().toString();
      String minute_amend = minuteAmend.getSelectedItem().toString();
      String second_amend = secondAmend.getSelectedItem().toString();
      //JOptionPane.showMessageDialog(null, "修改成功!");
      isThreadShow = false; //设置线程标记为False,中止线程
      //将修改的值进行显示
      hourShow.setText(hour_amend);
      minuteShow.setText(minute_amend);
      secondShow.setText(second_amend);
      System.out.println("修改的时间是:" + hour_amend + ":" + minute_amend + ":" + second_amend);
      threadAmend.start();//启动修改后运行时间的线程
    }
    //如果点击了启动秒表的按钮
    if (e.getSource() == second_JB) {
      //如果当前秒表是启动状态,也就是显示的是让停止计时
      if (second_JB.getText() == "停止计时") {
        second_JB.setText("启动秒表");
        second_JB.setBackground(Color.yellow);
        //threadSecond.stop();
        isStartSecond = false;
      }
      else {
        //如果当前秒表是关闭状态     
        second_JB.setText("停止计时");
        second_JB.setBackground(Color.RED);
        threadSecond.start();//启动秒表线程
        isStartSecond = true;
      }             
    }
    //如果点击了暂停按钮
    if (e.getSource() == pause_JB) {
      if (pause_JB.getText() == "暂停") {
        pause_JB.setText("继续");
        pause_JB.setBackground(Color.cyan);
        threadSecond.suspend();   //使该线程暂停
      }
      else {
        pause_JB.setText("暂停");
        pause_JB.setBackground(Color.RED);
        threadSecond.resume();    //使该线程继续
      }
    }
  }

image.gif

3、通过主线程对时间实时显示

对按钮控件添加了监听函数之后,是对当前时间的显示,时间的显示是使用主线程,并且在主线程中每一秒更新显示一次数据,在这里使用的是Date类进行系统时间的读取,并且再利用SimpleDateFormat将获取到的时间进行规范化处理,之后将经过处理后得到的年、月、日、星期、以及当前的时间在界面中进行显示出来,

@Override
  public void run() {
    while (true) {
    // TODO Auto-generated method stub
    Date date = new Date();   //实例化时间类对象
    //将当前获取到的时间规范化
    SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy");
    SimpleDateFormat monthFormat = new SimpleDateFormat("MM");
    SimpleDateFormat dayFormat = new SimpleDateFormat("dd");
    SimpleDateFormat weekFormat = new SimpleDateFormat("EEEE");
    SimpleDateFormat hourFormat = new SimpleDateFormat("HH");
    SimpleDateFormat minuteFormat = new SimpleDateFormat("mm");
    SimpleDateFormat secondFormat = new SimpleDateFormat("ss");
    //获取到当前的年、月、日、时、分、秒
    year = yearFormat.format(date);
    month = monthFormat.format(date);
    day = dayFormat.format(date);
    week = weekFormat.format(date);
    hour = hourFormat.format(date);
    minute = minuteFormat.format(date);
    second = secondFormat.format(date);
    hourShow.setText(hour);
    minuteShow.setText(minute);
    secondShow.setText(second);
    timeShow.setText(year + "年" + month + "月" + day + "日" + week);
    try {
      Thread.sleep(1000);   //让线程每一秒执行一次
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    //如果线程中止,跳出循环
    if (!isThreadShow) {
      break;
    }
    }
  }

image.gif

4、启用线程实现对时间的修改

在将系统时间显示出来之后,是对当前时间修改的操作,在这里的设计思路是,首先获取到修改的时间,然后利用break跳出主线程的循环,从而结束主线程的运行,之后将已经读取到的修改的时间在显示时间的标签中进行显示,同时开启修改后继续进行时间运行的threadAmend线程,并且每一秒更新一次,以至于时间可以不断的在已经修改过的基础上继续执行。效果如下图:

 

//设置threadAmend线程
    threadAmend = new Thread(new Runnable() {
      @Override
      public void run() {
        while (true) {
        int hourAmend = Integer.parseInt(hourShow.getText());
        int minuteAmend = Integer.parseInt(minuteShow.getText());
        int secondAmend = Integer.parseInt(secondShow.getText());
        secondAmend++;
        //对获取到的时间进行判断并作出处理
        if (secondAmend == 60) {
          minuteAmend++;
          secondAmend = 0;
        }
        if (minuteAmend == 60) {
          hourAmend++;
          minuteAmend=0;
        }
        if (hourAmend == 24) {
          hourAmend = 0;
          minuteAmend = 0;
          secondAmend = 0;
        }
        //将时间进行显示
        hourShow.setText(Integer.toString(hourAmend));
        minuteShow.setText(Integer.toString(minuteAmend));
        secondShow.setText(Integer.toString(secondAmend));
        try {
          threadAmend.sleep(1000);
        } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
      }
    });

image.gif

5、线程同步实现秒表功能

在修改时间的同时,会设定进行秒表运行的threadSecond线程,该线程的使用是在点击“启动秒表”按钮之后启动该线程,同时在后台开始计时,每秒对数据更新一次,之后在“暂停”按钮中添加事件,在点击“暂停”之后可以将threadSecond暂停,同时此按钮变成“继续”,在点击继续之后,threadSecond线程会继续执行,直到点击了“停止计时”之后,该线程将会跳出循环中止。效果如下图:

//设置threadSecond秒表线程
    threadSecond = new Thread(new Runnable() {
      @Override
      public void run() {
        //在每次开启秒表时,将数据初始化为0
        hourSecond = 0;
        minuteSecond = 0;
        secondSecond = 0;
        while (true) {
        secondSecond++;   //秒数加1
        //对获取到的时间进行判断并作出处理
        if (secondSecond == 60) {
          minuteSecond++;
          secondSecond = 0;
        }
        if (minuteSecond == 60) {
          hourSecond++;
          minuteSecond=0;
        }
        String SecondText = Integer.toString(hourSecond) + ":" +  Integer.toString(minuteSecond) + ":" + Integer.toString(secondSecond);
        second_Time.setText(SecondText);
        try {
          threadSecond.sleep(1000); //让线程每次休息一秒
        } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        //如果监控秒表线程的StartSecond为falsh,跳出循环
        if (!isStartSecond) {
          isStartSecond = true;
          break;
        }
        }
      }
    });

image.gif

6、运行并进行调试

在最后的秒表线程完成之后,整个电子表的开发就完成了,之后在主函数中直接调用该类即可运行成功。

public static void main(String[] args) {
    ElectronicClock eClock = new ElectronicClock();   
  }

image.gif

效果如下:

image.gif编辑

觉得不错记得点赞关注哟!

完整源码点击此处即可下载,

或源码链接:https://pan.baidu.com/s/1Zc1XEp2tSDM7nKOykPEKDQ

提取码:u2co

image.gif编辑

目录
相关文章
|
10天前
|
Java API Maven
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
53 10
|
9天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
2天前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
10 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
7天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
8天前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
|
7天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
13天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
37 9
|
11天前
|
Java Android开发
Eclipse 创建 Java 项目
Eclipse 创建 Java 项目
31 4
|
10天前
|
安全 Java 开发者
Java多线程编程中的常见问题与解决方案
本文深入探讨了Java多线程编程中常见的问题,包括线程安全问题、死锁、竞态条件等,并提供了相应的解决策略。文章首先介绍了多线程的基础知识,随后详细分析了每个问题的产生原因和典型场景,最后提出了实用的解决方案,旨在帮助开发者提高多线程程序的稳定性和性能。
|
12天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
下一篇
无影云桌面