SecondCounterInaccurate.java
上传用户:songled
上传日期:2022-07-14
资源大小:94k
文件大小:2k
源码类别:

进程与线程

开发平台:

Java

  1. import java.awt.*;
  2. import javax.swing.*;
  3. import java.text.*;
  4. public class SecondCounterInaccurate extends JComponent implements Runnable {
  5. private volatile boolean keepRunning;
  6. private Font paintFont;
  7. private volatile String timeMsg;
  8. private volatile int arcLen;
  9. public SecondCounterInaccurate() {
  10. paintFont = new Font("SansSerif", Font.BOLD, 14);
  11. timeMsg = "never started";
  12. arcLen = 0;
  13. }
  14. public void run() {
  15. runClock();
  16. }
  17. public void runClock() {
  18. DecimalFormat fmt = new DecimalFormat("0.000");
  19. long normalSleepTime = 100;
  20. int counter = 0;
  21. long startTime = System.currentTimeMillis();
  22. keepRunning = true;
  23. while ( keepRunning ) {
  24. try {
  25. Thread.sleep(normalSleepTime);
  26. } catch ( InterruptedException x ) {
  27. // ignore
  28. }
  29. counter++;
  30. double counterSecs = counter / 10.0;
  31. double elapsedSecs = 
  32. ( System.currentTimeMillis() - startTime ) / 1000.0;
  33. double diffSecs = counterSecs - elapsedSecs;
  34. timeMsg = fmt.format(counterSecs) + " - " + 
  35. fmt.format(elapsedSecs) + " = " +
  36. fmt.format(diffSecs);
  37. arcLen = ( ( ( int ) counterSecs ) % 60 ) * 360 / 60;
  38. repaint();
  39. }
  40. }
  41. public void stopClock() {
  42. keepRunning = false;
  43. }
  44. public void paint(Graphics g) {
  45. g.setColor(Color.black);
  46. g.setFont(paintFont);
  47. g.drawString(timeMsg, 0, 15);
  48. g.fillOval(0, 20, 100, 100);  // black border
  49. g.setColor(Color.white);
  50. g.fillOval(3, 23, 94, 94);  // white for unused portion
  51. g.setColor(Color.blue);  // blue for used portion
  52. g.fillArc(2, 22, 96, 96, 90, -arcLen);
  53. }
  54. }