主题; 创建一个单独的线程来定期执行某些操作

Jim*_*mmy 5 java multithreading thread-safety

作为我当前应用程序的补充,我需要创建一个单独的线程,它将定期进行一些处理

我创建了一个新类来完成所有这些,这个类将在我的应用程序启动时加载.

这是我到目前为止:

public class PeriodicChecker extends Thread
{
    static
    {
        Thread t = new Thread(new PeriodicChecker());
        while(true)
        {
            t.run();
            try
            {
                Thread.sleep(5000l);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

    /**
     * Private constructor to prevent instantiation
     */
    private PeriodicChecker()
    {

    }

    @Override
    public void run()
    {
        System.out.println("Thread is doing something");
        // Actual business logic here, that is repeated
    }

}
Run Code Online (Sandbox Code Playgroud)

我想使构造函数私有,以防止其他人试图意外地实例化这个类.我怎样才能做到这一点?

另外,我对这些要求的实施有什么不好吗?我只创建一个会运行然后睡觉的线程,我是否错过了任何明显的错误?我之前没有使用过线程

sjl*_*lee 12

Java提供ScheduledExecutorService来计划和运行具有延迟的周期性任务或任务.它应该提供您需要的所有功能.Timer是另一个提供类似功能的类,但我建议使用ScheduledExecutorService over Timer,因为它具有灵活的配置和更好的错误管理.


gre*_*uze 10

您的代码中有一些概念错误...例如:

  • 你应该调用start()而不是run(),因为你是按顺序而不是同时运行方法.
  • 您只能调用start()一次,而不是每次循环迭代调用一次.之后,线程处于TERMINATED状态,您应该创建一个新线程再次运行它
  • 你不应该在静态块中创建线程,这是一个不好的做法,也许线程在你希望它运行之前运行.

你应该阅读一些关于线程的例子,一开始就有点难以解决,你很容易产生不良影响.

这是一个小例子,可能会做你想要的类似的事情:

public class PeriodicChecker extends Thread
{
    @Override
    public void run()
    {
        while(true) {
           System.out.println("Thread is doing something");
           Thread.sleep(5000);
        }
    }

}

public OtherClass {
   public static void main(String args[]) {
      Thread t = new PeriodicChecker();
      t.start();
   }
}
Run Code Online (Sandbox Code Playgroud)

如果你想要没有人可以创建一个新的线程,你可以创建一个单例,所以你将确保没有人创建更多的线程.