间隔运行Java线程

我有一个需要每10秒执行一次的线程。 该线程包含对另一台服务器上的数据库的多次调用(12-15)。 此外,它还可以访问大约3个文件。 因此,将会有相当多的IO和网络开销。

执行上述操作的最佳策略是什么?

一种方法是使用sleep方法和while循环,但这将是一个糟糕的设计。

在这种情况下,类似于Timer的类会有用吗? 另外,最好是创建几个线程(一个用于IO,一个用于JDBC),而不是让它们在一个线程中运行?

我发现ScheduledExecutorService是一种很好的方法。 它可能比Timer稍微复杂一些,但在交换时提供了更大的灵活性(例如,您可以选择使用单个线程或线程池;它只需要毫秒以外的单位)。

 ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); Runnable periodicTask = new Runnable() { public void run() { // Invoke method(s) to do the work doPeriodicWork(); } }; executor.scheduleAtFixedRate(periodicTask, 0, 10, TimeUnit.SECONDS); 

看看Timer和TimerTask类。 它们正是你想要的。

您可以创建一个TimerTask实现,将您的线程对象置于构造函数中。

然后run方法将调用threads run方法。

 // Perhaps something like this Timer t = new Timer(); t.scheduleAtFixedRate(yourTimerTask, 0, 10 * 1000); // Hopefully your task takes less than 12 seconds 

一种选择是创建一个ScheduledExecutorService,然后您可以安排您的工作:

 ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor(); ex.scheduleWithFixedDelay(...); 

如果您确定拥有多个线程,那么您可以创建一个包含更multithreading的ScheduledExecutorService(同样,通过Executors类)。

就每个线程中有多少线程和你放入的内容而言,就性能而言,我认为这取决于:

  • 对于您的特定应用程序,一个线程可以真正“工作”而另一个线程正在等待I / O吗?
  • 您的多个线程最终会“捶打相同的资源”(例如,从同一dsk中不同位置的文件中读取),从而减慢彼此的速度,或者它们是否会同时击中不同的资源?