怎么用Java实现精确到毫秒的倒计时器

yugang1219 2008-07-28 01:46:30
现在要用Java实现一个倒计时器,我采用的办法是:先获得总的毫秒数matchTime,然后用Timer,每隔一毫秒就让matchTime减1,然后再把matchTime转换成时间的格式。但是这样做出来的时间走的比现实时间要慢得多,如果改成每100秒减100次,就和现实时间差不多了,这也就是说精确到了0.1秒。但是有没有办法精确到毫秒呢?
...全文
1333 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
云计算-魏军 2011-12-11
  • 打赏
  • 举报
回复
使用j2se来实现
yujianbo1988 2009-05-22
  • 打赏
  • 举报
回复
xiexie
冰思雨 2008-07-28
  • 打赏
  • 举报
回复
估计毫秒级,应该不好实现。我的机器,所有线程轮一圈,大概10毫秒。
所以,一旦程序中出现sleep,那么下次执行的毫秒数很有可能会滞后(每次最多10毫秒)。

JDK1.5当中的Timer类。楼主可以去看看。如果应用简单的话。应该能够达到要求。
leosming 2008-07-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 sagezk 的回复:]
Java codeimport java.util.Date;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.awt.Font;
import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

/**
* TimerFrame - 倒计时窗口
* @author SageZk
* @version 1.0
*/
@SuppressWar…
[/Quote]
  • 打赏
  • 举报
回复
this.runner = new Thread(new Runnable() {
public void run() {
Date t = new Date();
StringWriter sw = new StringWriter();
StringBuffer sb = sw.getBuffer();
PrintWriter pw = new PrintWriter(sw);
long cur = 0L, end = System.currentTimeMillis() + time;
while ((cur = end - System.currentTimeMillis()) > 0) {
t.setTime(cur);
pw.format("%1$tM:%1$tS.%tL", t);
pw.flush();
lblTime.setText(sb.toString());
sb.setLength(0);
try {
Thread.sleep(6L);
} catch (InterruptedException e) {
}
}
lblTime.setText("00:00.000");
try {
Thread.sleep(1200L);
} catch (InterruptedException e) {
}
lblTime.setText("Bomb!!!");
}
});
this.runner.setDaemon(true);
j_bar 2008-07-28
  • 打赏
  • 举报
回复
看见线程我就头疼
怎么学那玩意?
老紫竹 2008-07-28
  • 打赏
  • 举报
回复
用Timer 不就行了,quartz 也可以。
sagezk 2008-07-28
  • 打赏
  • 举报
回复
8楼的 Copy 我代码也不贴全,你那能通过编译吗?
chenhongxin 2008-07-28
  • 打赏
  • 举报
回复
import java.util.Date;
import java.io.PrintWriter;
import java.awt.Font;
import java.swing.JFrame;
public TimerFrame() {
super("TimerFrame");
this.lblTime = new JLabel("单击开始");
this.lblTime.setFont(new Font("Monospaced", Font.BOLD, 60));
this.lblTime.setHorizontalAlignment(SwingConstants.CENTER);
this.lblTime.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (runner != null) runner.start();
}
});
this.runner = new Thread(new Runnable() {
public void run() {
Date t = new Date();
StringWriter sw = new StringWriter();
StringBuffer sb = sw.getBuffer();
PrintWriter pw = new PrintWriter(sw);
long cur = 0L, end = System.currentTimeMillis() + time;
while ((cur = end - System.currentTimeMillis()) > 0) {
t.setTime(cur);
pw.format("%1$tM:%1$tS.%tL", t);
pw.flush();
lblTime.setText(sb.toString());
sb.setLength(0);
try {
Thread.sleep(6L);
} catch (InterruptedException e) {
}
}
lblTime.setText("00:00.000");
try {
Thread.sleep(1200L);
} catch (InterruptedException e) {
}
lblTime.setText("Bomb!!!");
}
});
this.runner.setDaemon(true);
getContentPane().add(this.lblTime, BorderLayout.CENTER);
setResizable(false);
setBounds(0, 0, 460, 330);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
new TimerFrame().setVisible(true);
}

}
kulongge 2008-07-28
  • 打赏
  • 举报
回复
顶楼上的.
sagezk 2008-07-28
  • 打赏
  • 举报
回复
import java.util.Date;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.awt.Font;
import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

/**
* TimerFrame - 倒计时窗口
* @author SageZk
* @version 1.0
*/
@SuppressWarnings("serial")
public class TimerFrame extends JFrame {

private long time = (long) (1.2 * 60 * 1000L); //倒计时时间(单位毫秒)
private JLabel lblTime;
private Thread runner;

public TimerFrame() {
super("TimerFrame");
this.lblTime = new JLabel("单击开始");
this.lblTime.setFont(new Font("Monospaced", Font.BOLD, 60));
this.lblTime.setHorizontalAlignment(SwingConstants.CENTER);
this.lblTime.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (runner != null) runner.start();
}
});
this.runner = new Thread(new Runnable() {
public void run() {
Date t = new Date();
StringWriter sw = new StringWriter();
StringBuffer sb = sw.getBuffer();
PrintWriter pw = new PrintWriter(sw);
long cur = 0L, end = System.currentTimeMillis() + time;
while ((cur = end - System.currentTimeMillis()) > 0) {
t.setTime(cur);
pw.format("%1$tM:%1$tS.%tL", t);
pw.flush();
lblTime.setText(sb.toString());
sb.setLength(0);
try {
Thread.sleep(6L);
} catch (InterruptedException e) {
}
}
lblTime.setText("00:00.000");
try {
Thread.sleep(1200L);
} catch (InterruptedException e) {
}
lblTime.setText("Bomb!!!");
}
});
this.runner.setDaemon(true);
getContentPane().add(this.lblTime, BorderLayout.CENTER);
setResizable(false);
setBounds(0, 0, 460, 330);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public static void main(String[] args) {
new TimerFrame().setVisible(true);
}

}
流子 2008-07-28
  • 打赏
  • 举报
回复
windows系统的计时精确度在15毫秒左右。
ldy214 2008-07-28
  • 打赏
  • 举报
回复
System.nanoTime()
  • 打赏
  • 举报
回复
getMilliseconds(),返回毫秒数。
椅子 2008-07-28
  • 打赏
  • 举报
回复
看起来是timer的精度不够

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧