我有一个需要每10秒执行一次的线程.该线程包含对另一台服务器上的数据库的多次调用(12-15).此外,它还可以访问大约3个文件.因此,将会有相当多的IO和网络开销.
执行上述操作的最佳策略是什么?
一种方法是使用sleep方法和while循环,但这将是一个糟糕的设计.
在这种情况下,类似于Timer的类会有用吗?另外,最好是创建几个线程(一个用于IO,一个用于JDBC),而不是让它们在一个线程中运行?
我发现ScheduledExecutorService是一种很好的方法.它可以说比a稍微复杂一些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);
一种选择是创建ScheduledExecutorService,然后可以将作业调度到该服务:
ScheduledExecutorService ex = Executors.newSingleThreadScheduledExecutor(); ex.scheduleWithFixedDelay(...);
如果您确实决定有多个线程,则可以创建具有更多线程的ScheduledExecutorService(同样,通过Executors类)。
就性能多少而言,就性能而言,我想说这取决于:
对于您的特定应用程序,一个线程可以真正“工作”,而另一个线程正在等待I / O吗?
您的多个线程最终是否会“破坏相同的资源”(例如,从同一dsk上不同位置的文件中读取)并因此使对方速度变慢,或者它们会同时占用不同的资源?