2013.09.17
Timer类的使用
这次我们要讲的是TimerTask类和Timer类的使用。
说道TimerTask类,与Thread类有相似之处,都是实现了Runnable接口,继承后要重写run方法,
在run方法里,我们要写内容其实是相同的,不同之处在于Thread里实现Runnable接口往往需要先进行一个死循环,或者用一个休止符控制这个循环,在循环里我们写入要一直实现的方法,然后每次循环即将结束时对线程进行一个休眠。而TimerTask类则有点不同,这个类不用进行死循环和每次循环的休眠,定义后,线程会自动地按一定周期性的运行。
首先我们是继承类TimerTask,然后我们就是要new一个Timer对象,Timer有一个方法,就是schedule(TimerTask task,long delay,long period);其中delay是指运行线程的时间,peroid是运行周期。
只要在主函数,监听器或者线程里进行计划,其中传入你要进行的TimerTask类,就可以实现线程的运行了。
今天我们要做的是一个定时闹钟:
我们来分析一下闹钟所需要实现的功能:
1、一个时钟:能够时刻提示现在的时间,方便我们设计闹钟
2、定时:能够在一个固定的时间点进行响铃
3、自定义声音文件:我们往往希望每次响用不同的声音
4、闹钟的存储:订一次以后就不需要再重复地订了
首先我们做一个界面
然后我们要让上面的时钟显示具体的时间:
/** * 时间面板的设定 * * @param jtf */ public void getTime(JTextField jtf) { ClockTimer ct = new ClockTimer(jtf, 0);// 实例化ClockTimer对象 Timer t = new Timer();// 创建Timer对象 t.schedule(ct, 50, 50);// 开启线程 }
然后我们写监听器的类:
public class ClockListener implements ActionListener { String path = null;// 声音文件路径 JComboBox jcbhour;// 小时的下拉框 JComboBox jcbmin;// 分钟的下拉框 JTextArea jta;// 文字区域 Timer t;// 声明Timer对象 ArrayList<Integer> arhour = new ArrayList<Integer>();// 小时的队列 ArrayList<Integer> arminute = new ArrayList<Integer>();// 分钟的队列 /** * 构造方法 * * @param jcbhour * @param jcbmin * @param jta */ public ClockListener(JComboBox jcbhour, JComboBox jcbmin, JTextArea jta) { this.jcbhour = jcbhour; this.jcbmin = jcbmin; this.jta = jta; t = new Timer(); } /** * 重写actionPerformed方法 */ public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("文件选择")) { JFileChooser jc = new JFileChooser("src/");// 实例化JFileChooser对象 jc.setFileSelectionMode(JFileChooser.FILES_ONLY);// 设置只可以选择文件 FileNameExtensionFilter jnef = new FileNameExtensionFilter("WAV", "wav");// 实例化后缀名对象 jc.setFileFilter(jnef);// 设置只可以选择这个后缀名 int returnVal = jc.showOpenDialog(jc);// 获取选择后的信息 if (returnVal == JFileChooser.APPROVE_OPTION) {// 如果操作可执行 path = jc.getSelectedFile().getAbsolutePath();// 获取当前文件的路径 } } if (e.getActionCommand().equals("设置")) { if (path != null) {// 如果路径不为空 int hour = Integer.parseInt(jcbhour.getSelectedItem() .toString());// 获取当前选择的小时 int minute = Integer.parseInt(jcbmin.getSelectedItem() .toString());// 获取当前选择的分钟 boolean bol = true;// 设置标识符 // 如果以前出现过这个时间 for (int i = 0; i < arhour.size(); i++) { if (arhour.get(i) == hour && arminute.get(i) == minute) { bol = false;// 设置标识符为否 } } if (bol) {// 如果以前没出现过,添加小时和分钟到队列中 arhour.add(hour); arminute.add(minute); jta.append("您设置了闹钟" + hour + "点" + minute + "分\n");// 在JTextArea中显示 ClockTimer ct = new ClockTimer(hour, minute, path, 1);// 实例化ClockTimer类 t.schedule(ct, 2000, 3000);// 运行线程 } else { JOptionPane.showMessageDialog(null, "已设置过该闹钟");// 否则弹出已设置该闹钟 } } else { JOptionPane.showMessageDialog(null, "请选择声音文件");// 弹出未选择声音文件 } } if (e.getActionCommand().equals("保存")) { File file = new File("src/cn/tth/study0917/save.ct");// 创建file对象 if (!file.exists()) {// 如果file不存在 try { file.createNewFile();// 创建file文件 } catch (IOException e1) { e1.printStackTrace(); } } try { FileOutputStream os = new FileOutputStream(file);// 创建文件输出流 DataOutputStream dos = new DataOutputStream(os);// 创建数据输出流 dos.writeInt(arhour.size());// 写入闹钟的个数 // 循环写入小时和分钟 for (int i = 0; i < arhour.size(); i++) { dos.writeInt(arhour.get(i)); dos.writeInt(arminute.get(i)); } dos.flush();// 强制写入 dos.close();// 关闭数据流 os.close();// 关闭文件流 } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } if (e.getActionCommand().equals("读取")) { File file = new File("src/cn/tth/study0917/save.ct");// 创建file文件 if (file.exists()) {// 如果文件存在 try { arhour.clear();// 清除当前队列 arminute.clear(); FileInputStream fis = new FileInputStream(file);// 创建文件输入流 DataInputStream dis = new DataInputStream(fis);// 创建数据输入流 int size = dis.readInt();// 获取队列的个数 for (int i = 0; i < size; i++) { int hour = dis.readInt();// 读取小时 int minute = dis.readInt();// 读取分钟 arhour.add(hour); arminute.add(minute); jta.append("您设置了闹钟" + hour + "点" + minute + "分\n");// 在JTextArea中显示 } dis.close();// 关闭数据流 fis.close();// 关闭文件流 } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } // 关于如何存入路径,目前还没有具体的解决方案,所以先设置一个固定路径 path = "G:\\JAVA\\Junior\\src\\fire.wav"; for (int i = 0; i < arhour.size(); i++) { ClockTimer ct = new ClockTimer(arhour.get(i), arminute.get(i), path, 1);// 根据读出的打开线程 t.schedule(ct, 2000, 3000);// 运行线程 } } else { JOptionPane.showMessageDialog(null, "找不到文件");// 文件不存在 } } if (e.getActionCommand().equals("清空")) { arhour.clear();// 清除队列内容 arminute.clear(); // 这里没有关闭已经创建的Timer类 jta.setText("");// 设置JTextArea内容为空 JOptionPane.showMessageDialog(null, "已全部清空");// 显示已全部清空 } if (e.getActionCommand().equals("关闭")) { System.exit(0);// 关闭窗体 } } }
最后我们写线程的类:
public class ClockTimer extends TimerTask { JTextField jtf; int i; int hour; int minute; String path; AudioClip audio; /** * 构造方法 * * @param jtf * @param i */ public ClockTimer(JTextField jtf, int i) { this.jtf = jtf; this.i = i; } /** * 构造方法 * * @param hour * @param minute * @param path * @param i */ @SuppressWarnings("deprecation") public ClockTimer(int hour, int minute, String path, int i) { this.hour = hour; this.minute = minute; this.path = path; this.i = i; try { audio = Applet.newAudioClip((new File(path)).toURL()); } catch (MalformedURLException e) { e.printStackTrace(); } } /** * 重写run方法 */ public void run() { Calendar date = Calendar.getInstance();// 获取当前时间 int hour = date.get(Calendar.HOUR_OF_DAY);// 小时 int minute = date.get(Calendar.MINUTE);// 分钟 if (i == 0) {//如果是上面的时间 int year = date.get(Calendar.YEAR);// 年 int month = date.get(Calendar.MONTH);// 月 int day = date.get(Calendar.DAY_OF_MONTH);// 日 int second = date.get(Calendar.SECOND);// 秒 jtf.setText(year + "年" + month + "月" + day + "日" + hour + "时" + minute + "分" + second + "秒");// 设置JTextArea } if (i == 1) {//如果是闹钟 // 如果到了设定的时间 if (hour == this.hour && minute == this.minute) { audio.play();// 播放声音 } } } }
相关推荐
Java定时器,也被称为`Timer`类,是Java标准库中的一个强大工具,它允许开发者在指定的时间间隔执行任务,从而实现定时操作。这个类在`java.util`包中定义,是实现定时任务调度的核心。在本文中,我们将深入探讨`...
Java中的`Timer`类和`TimerTask`是用于计划任务执行的重要工具,它们在Java标准版(J2SE)和微型版(J2ME)环境中都有应用。然而,这两个类的功能相对有限,不能满足所有复杂任务调度的需求。例如,它们无法处理因...
总的来说,通过这个“java实例——闹钟”,我们可以深入了解Java的定时器机制,这对于开发各种需要定时触发功能的应用(如定时备份、自动检查更新等)非常有用。不断练习和理解这些基础知识,将有助于提升你在Java...
Java定时器(Timer)是Java Swing库中的一个类,它提供了调度任务在未来某个时间执行的能力。这个类主要用于在GUI应用程序中实现定时触发某些操作,比如更新界面、执行动画或者执行周期性的后台任务。Timer类结合了...
在Java编程语言中,`Timer`类是Java.util包下的一个关键组件,它主要用于调度周期性的任务执行。这个`Timer`类提供了定时器的功能,能够按照预设的时间间隔执行任务,比如更新UI、执行定时检查等。在描述中提到的是...
【Java实现的小闹钟】是基于Java Swing技术开发的一款简易应用程序。Java Swing是Java Foundation Classes (JFC)的一部分,提供了一套丰富的用户界面组件,用于创建桌面应用。在这个项目中,开发者利用Swing构建了一...
在Java编程领域,创建一个“小闹钟”应用程序是一个经典的实践项目,它涉及到多线程、时间处理和用户界面设计等多个关键知识点。下面我们将详细探讨这些核心概念。 首先,Java中的多线程是实现小闹钟功能的基础。在...
在Java编程中,`Timer`类和`TimerTask`类是用于实现定时任务和计划任务的核心组件。它们属于`java.util`包,为开发者提供了在特定时间间隔执行任务的能力。然而,标准的`Timer`类和`TimerTask`类在某些复杂场景下...
Java Timer定时器详解 Java Timer定时器是Java语言中的一种常用的定时器机制,它可以帮助开发者实现一些需要在特定时间或...通过使用java.util.Timer和java.util.TimerTask两个类,开发者可以轻松地实现定时器的功能。
Java时间类库Timer的使用方法与实例详解 Java时间类库Timer是Java语言中的一种常用的定时器工具,可以用来实现简单的定时调度。下面将详细介绍Java时间类库Timer的使用方法与实例。 一、创建Timer对象 要使用...
3. **定时任务**:实现闹钟功能,开发者可能使用了Java的定时器类`java.util.Timer`或`java.util.concurrent.ScheduledExecutorService`。这些类可以周期性地执行特定任务,例如检查当前时间是否到了设定的闹钟时间...
Java 语言中的 `Timer` 类和 `TimerTask` 类是用于计划和执行周期性任务的重要工具,它们在 Java 2 SDK, Standard Edition, Version 1.3 中被引入。这两个类为开发者提供了一种简单的方式来安排任务在未来的某个时刻...
在这种情况下,可以使用Servlet容器提供的定时任务机制来代替标准的 `java.util.Timer` 类。通常做法是在 Servlet 的 `init()` 方法中安排定时任务,这样可以确保任务与 Web 应用程序的生命周期同步。 例如,可以在...
在实际应用中,Java提供了`java.util.Timer`和`java.util.TimerTask`类,它们是Java标准库的一部分,可以更方便地实现定时任务。`java.util.Timer`类可以安排在未来某一时间运行的任务,而`TimerTask`是一个抽象类,...
标题中的“MFC小闹钟 闹钟 MFC时钟 时间 Timer”暗示了这是一个使用Microsoft Foundation Class (MFC)库开发的小型应用程序,其主要功能是实现一个闹钟功能,可能包括显示当前时间并设置定时提醒。MFC是微软提供的...
在C++编程中,`Timer`类是一种常见的时间管理工具,用于执行周期性的任务或者在特定时间间隔后触发某一操作。在标题和描述中提到的`Timer`类,可能是指一个自定义的类设计,用于模拟系统级定时器的功能。在C++中,...
在Java中,Timer和TimerTask是两个经常用来实现定时器的类。这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求。 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务,并可以按计划一次或反复...
Timer 类在 Java 中是用于调度任务的工具,它允许程序员安排任务在未来某个时间点或者按照一定的周期执行。这个类位于 `java.util` 包下,与之配合使用的还有一个名为 `TimerTask` 的抽象类,它是所有计划任务的基础...