开发者社区> 灰小猿> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看

 

目录

1、前端界面的设计

2、添加控件的事件监听

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

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

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

6、运行并进行调试


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

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

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

 

1、前端界面的设计

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

imageimage.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

效果如下:

imageimage.gif编辑

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

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

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

提取码:u2co

imageimage.gif编辑

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
时间轮-Java实现篇
在前面的文章《[时间轮-理论篇](https://developer.aliyun.com/article/910513)》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
510 0
Coap协议接入物联网平台(java实现)
本文介绍基于开源的CoAP协议进行对称加密自主接入的流程,并提供java示例代码。
1323 0
【OSS最佳实践】JAVA实现RTMP推流上传OSS的签名URL
背景介绍 OSS支持使用RTMP协议推送H264编码的视频流和AAC编码的音频流到OSS。推送到OSS的音视频数据可以点播播放;在对延迟不敏感的应用场景,也可以做直播用途。RTMP推流上传的流程是创建LiveChannel以后生成推流地址,关于这块的介绍在官方帮助文档里也有介绍,具体可以参考文档"RTMP推流上传"。
1836 0
教你快速实现类对象的序列化/反序列化 | 带你学《Java语言高级特性》之七十
上一节中我们通过在类中实现Serializable声明该类能够序列化,本节将带领读者借助ObjectOutputStream类和ObjectInputStream类实现对象的序列化和反序列化。
662 0
System类助力标准IO实现 | 带你学《Java语言高级特性》之六十六
在我们日常的生活中,计算机与我们的沟通主要是通过显示器和键鼠设备来完成的,而在Java中,显示器的输出功能和键鼠设备的输入功能则是依赖于System类的支持,本节将介绍它的相关内容。
712 0
运用内存操作流实现IO操作 | 带你学《Java语言高级特性》之六十一
文件操作流能够实现对文件内容的读写操作,若是碰到了不希望产生文件的IO操作,显然是不能实现的,此时就需要用到内存操作流程。本节将为读者介绍内存操作流的相关知识。
1201 0
使用红黑树实现节点增减的平衡修复 | 带你学《Java语言高级特性》之四十二
了解了红黑树的基本内容后,本节将结合详细的示例图为读者介绍红黑树对节点增加和节点删除操作的平衡功能的实现原理。
1058 0
手把手教你实现二叉树数据添加 | 带你学《Java语言高级特性》之三十九
二叉树可以优化查找效率的关键原因在于其特殊的数据保存方式,在保存时就借助比较器提前完成数据的有序摆放。本节将结合具体案例讲解实现二叉树数据保存的方法。
1121 0
Comparable助你实现自定义比较 | 带你学《Java语言高级特性》之三十六
上一节中我们已经了解到常规的排序比较功能并不适用于对象,本节将介绍JDK1.2之后Java为开发者提供的Comparable接口的相关内容。
985 0
使用Base64实现信息加密传输 | 带你学《Java语言高级特性》之三十四
在实际场景中经常会有数据通信事件,而对于某些对安全性要求比较高的需求,简单的数据传输是不够用的,本节将为读者介绍使用Base64加密解密数据的方法。
922 0
+关注
灰小猿
一个用代码编织世界的工程师
文章
问答
文章排行榜
最热
最新
相关电子书
更多
从《阿里巴巴Java开发手册》编写推广谈技术成长
立即下载
应用 Docker 进行持续交付:用技术改变交付路程
立即下载
沪江基于Node.js大规模应用实践
立即下载