前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深度讲解Java多线程开发—电子表项目实现

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

作者头像
灰小猿
发布2020-09-23 11:15:02
6510
发布2020-09-23 11:15:02
举报

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

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

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

1、前端界面的设计

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

2、添加控件的事件监听

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

代码语言:javascript
复制
        @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将获取到的时间进行规范化处理,之后将经过处理后得到的年、月、日、星期、以及当前的时间在界面中进行显示出来,

代码语言:javascript
复制
        @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线程,并且每一秒更新一次,以至于时间可以不断的在已经修改过的基础上继续执行。效果如下图:

代码语言:javascript
复制
                //设置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线程会继续执行,直到点击了“停止计时”之后,该线程将会跳出循环中止。效果如下图:

代码语言:javascript
复制
                //设置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、运行并进行调试

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

代码语言:javascript
复制
	public static void main(String[] args) {
		ElectronicClock eClock = new ElectronicClock();		
	}

效果如下:

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

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

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

提取码:u2co

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、前端界面的设计
  • 2、添加控件的事件监听
  • 3、通过主线程对时间实时显示
  • 4、启用线程实现对时间的修改
  • 5、线程同步实现秒表功能
  • 6、运行并进行调试
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档