簡體   English   中英

計時器無法正常運行(Java)

[英]Timer is not working properly (Java)

我正在編寫一個簡單的Java代碼,使我能夠將當前時間輸出到單個文本文件中。 我能夠將當前所有時間成功寫入文本文件。 但是,然后我嘗試使用一個計時器,該計時器每4秒觸發一次簡單任務(輸出當前時間),該計時器無法正常工作。 這怎么可能呢? 我該如何解決這個問題? 謝謝 !

碼:

      import java.io.BufferedWriter;
      import java.io.File;
      import java.io.FileWriter;
      import java.io.IOException;
      import java.io.Writer;
      import java.text.SimpleDateFormat;
      import java.util.Date;
      import java.util.Timer;
      import java.util.TimerTask;

      public class testWriteTimeToFile extends javax.swing.JFrame {

        public Writer writer=null;
        public File file;
        protected boolean isRunning=false;
        public Timer timer = new Timer();

        public testWriteTimeToFile() {
            initComponents();
            initTimer();
        }

        public void initTimer()
        {
          this.isRunning=true;  
          tryToGetUpdateTime();
        }

        public void tryToGetUpdateTime()
        {
            java.awt.EventQueue.invokeLater(new Runnable() {

            SimpleDateFormat sdfMonth = new SimpleDateFormat("dd/MM/yyyy");
            SimpleDateFormat sdfHour = new SimpleDateFormat("HH:mm:ss");

             public void run() {
                while (isRunning) {
                    TimerTask task = new TimerTask()
                    {
                        public void run()
                        {          
                            try{
                            file= new File("c:/Users/user/Desktop/updateTime.txt");

                            if(!file.exists())
                            {
                                file.createNewFile();
                            }

                            FileWriter fileWriter = new FileWriter(file,true);
                            BufferedWriter bufferWritter = new BufferedWriter(fileWriter);

                            Date date = new Date();  

                            bufferWritter.append(sdfMonth.format(date) + " " + sdfHour.format(date) + '\n');

                            bufferWritter.close();
                       }catch(IOException ex){
                           System.err.println("Error in Writer : " + ex);
                       }              
                  }
              };
                timer.scheduleAtFixedRate(task,0,4000); 
              }
             }
          });
        }

     public static void main(String args[]) {
     java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new testWriteTimeToFile().setVisible(true);
            }
        });
    }
}

您需要改善編碼。 這是您在代碼中需要注意的事情

  • Java名稱約定

  • 你在程序中有無限循環

  • 優良作法是從代碼頂部而不是代碼頂部導入包
  • 無需使用搖擺物品。
  • 您需要學習如何使計時器工作。

嘗試以下代碼,我為您重寫了

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class testWriteTimeToFile {

    public Writer writer = null;
    public File file;
    protected boolean isRunning = false;
    public Timer timer = null;

    public testWriteTimeToFile(int n) {
        // initComponents();
        initTimer();
        timer = new Timer();

        // run task every 4 seconds
        timer.schedule(new Task(1,2,3), 0, n * 1000);
    }

    public void initTimer() {
        this.isRunning = true;
        // tryToGetUpdateTime();
    }

    class Task extends TimerTask {

        private int a,b,c;      
        private double e,f,g;
        private String h,i,j;

        // take int
        public Task (int a, int b, int c){

            this.a = a;
            this.b = b;
            this.c = c;
        }

        // take double
        public Task (double e, double f, double g){

            this.e = e;
            this.f = f;
            this.g = g;
        }

        // take string
        public Task (String h, String i, String j){

            this.h = h;
            this.i = i;
            this.j = j;
        }

        @Override
        public void run() {
            final SimpleDateFormat sdfMonth = new SimpleDateFormat("dd/MM/yyyy");
            final SimpleDateFormat sdfHour = new SimpleDateFormat("HH:mm:ss");
            // only do it for 5 second
            file = new File("c:/test/time.txt");

            try {

                FileWriter fileWriter = new FileWriter(file, true);
                BufferedWriter bufferWritter = new BufferedWriter(fileWriter);

                Date date = new Date();

                bufferWritter.append(sdfMonth.format(date) + " "
                        + sdfHour.format(date) + '\n');

                bufferWritter.close();
            } catch (IOException ex) {
                System.err.println("Error in Writer : " + ex);
            }

        }

    }

    public static void main(String args[]) {

        new testWriteTimeToFile(4);

    }
}

您的while循環會在每次迭代時連續調度一個新的TimerTask。 Timer工作正常,但您僅應安排一個TimerTask實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM