如何用java做一个纳秒级别的正计时器

如何用java做一个纳秒级别的正计时器,第1张

SystemcurrentTimeMillis() ,当前时间-开始时间 = 结果,不过你是需要做成窗体的,还是就是一个程序里面的方法? 无论你使用那种,SystemcurrentTimeMillis() 这方法都适用!

import javautilTimerTask;public class HeartBeatTask extends TimerTask {private int timerInterval;public HeartBeatTask(int timeInterval){thistimerInterval=timeInterval;}public void run() {// 在这里添加你需要周期性运行的代码Systemoutprintln("Welcome");}public static void main(String[] args ){javautilTimer t1 = new javautilTimer();HeartBeatTask tt = new HeartBeatTask(3000);t1schedule(tt, 0, 3000);}}TimerTask protected TimerTask() 创建一个新的计时器任务。run public abstract void run() 此计时器任务要执行的 *** 作。 public class TimerextendsObject一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。对Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。默认情况下,任务执行线程并不作为守护线程 来运行,所以它能够阻止应用程序终止。如果调用者想要快速终止计时器的任务执行线程,那么调用者应该调用计时器的 cancel 方法。如果意外终止了计时器的任务执行线程,例如调用了它的 stop 方法,那么所有以后对该计时器安排任务的尝试都将导致 IllegalStateException,就好像调用了计时器的 cancel 方法一样。此类是线程安全的:多个线程可以共享单个 Timer 对象而无需进行外部同步。此类不 提供实时保证:它使用 Objectwait(long) 方法来安排任务。 实现注意事项:此类可扩展到大量同时安排的任务(存在数千个都没有问题)。在内部,它使用二进制堆来表示其任务队列,所以安排任务的开销是 O(log n),其中 n 是同时安排的任务数。实现注意事项:所有构造方法都启动计时器线程。Timer public Timer() 创建一个新计时器。 schedule public void schedule(TimerTask task, long delay, long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。

在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。从长期来看,执行的频率一般要稍慢于指定周期的倒数(假定 Objectwait(long) 所依靠的系统时钟是准确的)。 固定延迟执行适用于那些需要“平稳”运行的重复活动。换句话说,它适用于在短期运行中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包括为响应人类活动所执行的固定活动,如在按住键时自动重复输入字符。 参数:task - 所要安排的任务。delay - 执行任务前的延迟时间,单位是毫秒。period - 执行各后续任务之间的时间间隔,单位是毫秒。抛出:IllegalArgumentException - 如果 delay 是负数,或者 delay + SystemcurrentTimeMillis() 是负数。IllegalStateException - 如果已经安排或取消了任务,已经取消了计时器,或者计时器线程已终止。 public void schedule(TimerTask task, Date firstTime, long period) 安排指定的任务在指定的时间开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。

在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则后续执行也将被延迟。在长期运行中,执行的频率一般要稍慢于指定周期的倒数(假定 Objectwait(long) 所依靠的系统时钟是准确的)。 固定延迟执行适用于那些需要“平稳”运行的重复执行活动。换句话说,它适用于在短期运行中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包括为响应人类活动所执行的固定活动,如在按住键时自动重复输入字符。 参数:task - 所要安排的任务。firstTime - 首次执行任务的时间。period - 执行各后续任务之间的时间间隔,单位是毫秒。抛出:IllegalArgumentException - 如果 timegetTime() 是负数。

我swing差不多都忘了,你的00控制用DecimalFormat这个类,可以参考JDK中文帮助文档关于它的方法;

DecimalFormat format = new DecimalFormat("00");

String abc ="1";

String a = formatformat(abc)toString();

Systemoutprintln(a);

不用GUI的思路:

实例化一个DecimalFormat的对象f,定义小时分秒为三个字符串变量;

从秒开始,用for循环,循环体是{秒++;if(秒==60){分+=1;秒=0}if(分==60){小时+=1;分=0}if(小时==24){小时=0},Systemoutprint(fformat(小时) + “:”+fformat(分) “:”+fformat (秒));Systemoutprint("\r");这个\r是光标移动到小时第一个数字前面,以至于时间循环覆盖造成原位置变化的效果。ThreadSleep(1000);这个是1秒间隔的设置注意导入Thread类}

这个思路已经完成了代码的90%了,剩下的是你自己根据这个思路边查看JDK边写程序,如果直接给你代码会害了你。用GUI效果就是把Systemoutprint改成类似textsetText();

哎这个太简单了。。。

Timer t = new Timer();

int s = 5;

TimerTask tt = new TimerTask()

{

public void run()

{

if(s >0)

s--;

}

};

tscheduleAtFixedRate(tt,0,1000);

一般来讲java里面50或更高的JDK中,定时任务基本上都不再使用Timer。而是使用ScheduledThreadPoolExector来替代实现javautilTimer计时器有管理任务延迟执行("如1000ms后执行任务")以及周期性执行("如每500ms执行一次该任务")。但是,Timer存在一些缺陷,因此你应该考虑使用ScheduledThreadPoolExecutor作为代替品,Timer对调度的支持是基于绝对时间,而不是相对时间的,由此任务对系统时钟的改变是敏感的;ScheduledThreadExecutor只支持相对时间。Timer的另一个问题在于,如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被安排但尚未执行的TimerTask永远不会再执行了,新的任务也不能被调度了。Timer存在的缺陷被ScheduledThreadPoolExector锁弥补替代。由于篇幅原因。

用Timer类好一些。

--------------------------------------------------------------------------------

import javautilCalendar;

import javautilDate;

import javautilTimer;

import javautilTimerTask;

public class Main {

public static void main(String[] args) {

Calendar taskTime = CalendargetInstance();

taskTimeset(CalendarMONTH, 11);

taskTimeset(CalendarDATE, 31);

taskTimeset(CalendarHOUR, 22);

taskTimeset(CalendarMINUTE, 00);

Calendar now = CalendargetInstance();

if (taskTimeafter(now)) {

// 任务时间在当前时间之后,设置当年 12/31 22:00执行

new Timer()schedule(new MyTask(taskTime), taskTimegetTime());

} else if (taskTimeget(CalendarYEAR) == nowget(CalendarYEAR)) {

// 任务时间在当前时间之前,并且是同一年,执行一次

new Timer()schedule(new MyTask(taskTime), new Date());

} else {

//

taskTimeadd(CalendarYEAR, nowget(CalendarYEAR));

new Timer()schedule(new MyTask(taskTime), taskTimegetTime());

}

}

}

class MyTask extends TimerTask {

private Calendar taskTime = null;

public MyTask(Calendar taskTime) {

thistaskTime = taskTime;

}

public void run() {

// 你要执行的

Systemoutprintln("hello");

// 年+1

taskTimeadd(CalendarYEAR, 1);

new Timer()schedule(new MyTask(taskTime), taskTimegetTime());

}

}

package chn1;

import javaawtEventQueue;

public class ExamCountDown extends JFrame implements Runnable{

/

  

 /

private static final long serialVersionUID = 1L;

private boolean flag = true;

private boolean flag1 = true;

private JPanel contentPane;

private Timer timer;

private JTextArea textArea;

private String string = "02:00:00";

private int []intArray;

private JButton button;

/

  Launch the application

 /

public static void main(String[] args) {

EventQueueinvokeLater(new Runnable() {

public void run() {

try {

ExamCountDown frame = new ExamCountDown();

framesetVisible(true);

} catch (Exception e) {

eprintStackTrace();

}

}

});

}

/

  Create the frame

 /

public ExamCountDown() {

String []stringArray = stringsplit(":");

intArray = new int[3];

for(int i = 0;i < stringArraylength;i++){

intArray[i] = IntegerparseInt(stringArray[i]);

}

setTitle("\u8003\u8BD5\u65F6\u95F4\u5012\u8BA1\u65F6");

setDefaultCloseOperation(JFrameEXIT_ON_CLOSE);

setBounds(100, 100, 450, 300);

contentPane = new JPanel();

contentPanesetBorder(new EmptyBorder(5, 5, 5, 5));

setContentPane(contentPane);

JLabel label = new JLabel("\u5269\u4F59\u65F6\u95F4\uFF1A");

labelsetFont(new Font("宋体", FontBOLD, 27));

textArea = new JTextArea();

textAreasetText(string);

textAreasetFont(new Font("宋体", FontBOLD, 27));

timer = new Timer();

button = new JButton("开始");

buttonaddActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent e) {

timer = new Timer();

textAreasetText(string);

flag = true;

flag1 = true;

// TODO Auto-generated method stub

timerschedule(new Task(),0, 1000);

buttonsetEnabled(false);

string = "02:00:00";

}

});

JButton button_1 = new JButton("暂停");

button_1addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

try {

flag = false;

} catch (Exception e1) {

// TODO: handle exception

}

}});

JButton button_2 = new JButton("继续");

button_2addActionListener(new ActionListener(){

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

flag = true;

}

});

GroupLayout groupLayout = new GroupLayout(contentPane);

groupLayoutsetHorizontalGroup(

groupLayoutcreateParallelGroup(AlignmentLEADING)

addGroup(groupLayoutcreateSequentialGroup()

addGap(35, 35, 35)

addGroup(groupLayoutcreateParallelGroup(AlignmentLEADING, false)

addGroup(groupLayoutcreateSequentialGroup()

addComponent(label)

addPreferredGap(ComponentPlacementRELATED)

addComponent(textArea, GroupLayoutPREFERRED_SIZE, GroupLayoutDEFAULT_SIZE, GroupLayoutPREFERRED_SIZE))

addGroup(groupLayoutcreateSequentialGroup()

addComponent(button)

addGap(47, 47, 47)

addComponent(button_1)

addPreferredGap(ComponentPlacementRELATED, GroupLayoutDEFAULT_SIZE, ShortMAX_VALUE)

addComponent(button_2)))

addContainerGap(101, ShortMAX_VALUE))

);

groupLayoutsetVerticalGroup(

groupLayoutcreateParallelGroup(AlignmentLEADING)

addGroup(groupLayoutcreateSequentialGroup()

addGap(58, 58, 58)

addGroup(groupLayoutcreateParallelGroup(AlignmentBASELINE)

addComponent(label)

addComponent(textArea, GroupLayoutPREFERRED_SIZE, 35, GroupLayoutPREFERRED_SIZE))

addGap(64, 64, 64)

addGroup(groupLayoutcreateParallelGroup(AlignmentBASELINE)

addComponent(button)

addComponent(button_1)

addComponent(button_2))

addContainerGap(76, ShortMAX_VALUE))

);

contentPanesetLayout(groupLayout);

}

public JTextArea getTextArea() {

return textArea;

}

public void setTextArea(JTextArea textArea) {

thistextArea = textArea;

}

class Task extends TimerTask{

String string1 = string;

DecimalFormat decimalFormat = new DecimalFormat("00");

public void run() {

if(flag1 == false){

return;

}

// TODO Auto-generated method stub

if(flag == true){

intArray[2] -= 1;

if(intArray[2] < 0)

{

intArray[1] -= 1;

intArray[2] += 60;

if(intArray[1] < 0)

{

intArray[0] -= 1;

intArray[1] += 60;

}

}

if(intArray[0] <= 0 && intArray[1] <= 0

&& intArray[2] <= 0)

{

flag1 = false;

buttonsetEnabled(true);

timercancel();

string = new String(intArray[0] + ":" + intArray[1]

                                                 + ":" + intArray[2]);

string = Stringformat("%02d:%02d:%02d", intArray[0],intArray[1],intArray[2]);

textAreasetText(string);

string = "02:00:00";

String []stringArray = stringsplit(":");

intArray = new int[3];

for(int i = 0;i < stringArraylength;i++){

intArray[i] = IntegerparseInt(stringArray[i]);

}

return;

}                                       

string = Stringformat("%02d:%02d:%02d", intArray[0],intArray[1],intArray[2]);

textAreasetText(string);

}

}

}

@Override

public void run() {

// TODO Auto-generated method stub

}

}

您好,Java计时器频率是指Java程序中计时器的频率,也就是每隔多长时间触发一次计时器。Java计时器频率是由程序员自己设定的,一般来说,可以设置任意的时间间隔,从毫秒到小时都可以。Java计时器频率的设置可以通过Timer类的schedule()方法来实现,其中可以设置计时器的时间间隔,以及计时器触发时要执行的任务。此外,Java计时器频率也可以通过TimerTask类的scheduleAtFixedRate()方法来实现,其中可以设置计时器的时间间隔,以及计时器触发时要执行的任务。

以上就是关于如何用java做一个纳秒级别的正计时器全部的内容,包括:如何用java做一个纳秒级别的正计时器、如何使用Java实现周期性 *** 作、Java计时器问题 现在程序是从系统当前时间开始计时 我想修改为从00:00:00开始计时 怎么弄呀(其它不变)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9393887.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存