深度讲解Java多线程开发—电子表项目实现
lipiwang 2024-10-29 15:55 8 浏览 0 评论
Hello,大家好,我是Java刘先生!
今天和大家分享一个使用Java多线程开发的电子表项目,可以实现电子表中时间的实时显示,修改以及秒表的功能。
Java电子表设计的设计顺序为从前端界面到后端类及线程的设计,之后将前后端相结合而成。以下是电子表的开发过程:
1、前端界面的设计
电子表的前端界面设计依据JFrame窗体和Container容器,采用绝对定位的方法对时间显示、时间修改、秒表显示等控件进行合理布局设计,力求界面美观简洁。
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(); //使该线程继续
}
}
}
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;
}
}
}
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();
}
}
}
});
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;
}
}
}
});
6、运行并进行调试
在最后的秒表线程完成之后,整个电子表的开发就完成了,之后在主函数中直接调用该类即可运行成功。
public static void main(String[] args) {
ElectronicClock eClock = new ElectronicClock();
}
效果如下:
完整源码链接:https://pan.baidu.com/s/1Zc1XEp2tSDM7nKOykPEKDQ
提取码:u2co
如果对我写的文章感兴趣,或者想获取架构进阶以及大厂面试资料的可以加入我的 Java架构抠抠裙 373786412 免费获取,相互交流学习!
相关推荐
- 前端 JavaScript 字符串中提取数字
-
varstr="4500元";varnum=parseInt(str);alert(num);//4500如果字符串前面有非数字字符,上面这种方法就不行了:var...
- 使用JavaScript如何获取网站网址(js如何获取浏览器信息)
-
在做网站开发时,我们有时候会获取当前页面的完整路径。在网页前端如何实现呢?请在网页脚本代码段中粘贴如下代码。functiongetRootPath(){//获取当前网址,...
- java文本对比工具源码8(java比较文本相似度)
-
/***ParseatextualrepresentationofpatchesandreturnaListofPatch*objects.*@paramtextline...
- JavaScript实现的9大排序算法(js排序方法)
-
笔试面试经常涉及各种算法,本文简要介绍常用的一些算法,并用JavaScript实现。1、插入排序1)算法简介插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通...
- 使用函数化的Javascript代码编写方式
-
对于Javascript介绍想必大家都耳熟能详啦,基于函数化的编程语言,基于浏览器运行的编程语言,web开发语言,前端开发必备语言,blablabla...Javascript是一个非常灵...
- Js基础31:内置对象(js内置对象是什么意思)
-
js里面的对象分成三大类:内置对象ArrayDateMath宿主对象浏览器提供的对象(如bom、dom等等)自定义对象开发人员自己定义的对象内置对象——所谓内置对象,就是JavaScript自...
- js获取上传文件类型以及大小的方法
-
前端web上传文件时,需要在上传之前判断一下文件的类型以及文件的大小,HTML为前端的标记语言是无法做到这一点,只能使用javascript动态脚本代码来实现。js获取上传文件大小的方法示例代码:&...
- 黑客入门实践:如何绕过前端过滤上传文件
-
今天开始,我们就要开始学习具体的漏洞了,但是希望大家学完后,不要轻易"入侵"网站哦,当时测试环境下除外。今天的课程是关于“文件上传漏洞”,据安界网的老师介绍,文件上传漏洞仅次于命令执行...
- Java文件上传细讲(java文件夹上传)
-
什么是文件上传?文件上传就是把用户的信息保存起来。为什么需要文件上传?在用户注册的时候,可能需要用户提交照片。那么这张照片就应该要进行保存。免费学习资料获取方式上传组件(工具)为什么我们要使用上传工具...
- 鸿蒙上实现“翻译”功能(鸿蒙宴全文翻译)
-
本章节我们来制作中文翻译成英文的实例(运行在HarmonyOS上),通过HTTP去配合API进行实现。需求分析如下:文字输入HTTP协议使用文字翻译控件介绍①HTTP数据请求官方文档请求...
- JavaScript从入门到精通(javascript 入门教程)
-
前几天,我们学习了JavaScript的入门课程,但是要想做网站,仅仅学会入门是不够的,今后的几天,我将带领大家精通JavaScript,希望大家好好学习!JS内置对象String对象:字符串对象,提...
- 第15天|16天搞定前端,javascript语法篇(干货)
-
JavaScript是互联网上最流行的脚本语言,这门语言可用于HTML和web,可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。它是一个脚本语言,它是一个轻量级,但功能强大的编程...
- 通过js来实现打字效果(js如何输入)
-
有时候浏览网页经常会看见一些页面出现一些打字的效果,那么是怎么实现的呢?逻辑确定目标容器,在哪个容器进行输出确定输出内容,当前直接根据目标容器确定输出内容即可需要控制输出频率,因此需要循环输出完毕代码...
- 手把手教你学会一键还原混淆js原理
-
1.短变量名在以下示例代码中,我们将变量“customerName”替换为“a”:vara="JohnSmith";console.log(a);2.随机变量名在以下示例代码...
- sql中常用的字符串函数详解(sql字符串函数有哪些)
-
在日常开发中遇到处理最多的可能字符串要算其中一个了,什么替换啊截取啊大小写转换啊、删除空格啊等等,这些操作我们可以在前端操作,也可以直接在数据库的sql中操作,那么我们来看一下sql中处理字符串的...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)