间隔运行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中不同位置的文件中读取),从而减慢彼此的速度,或者它们是否会同时击中不同的资源?
- 每次Java更新时,web启动jarvalidation都会变慢
- 使用Java中的算法更改图形的角度/位置
- 在HashMap中,为什么阈值(resize的下一个大小值)是capacity * load factor。 为什么不等于地图的大小或容量
- Java Graphics:从Font构造FontMetrics,没有Graphics2D
- Spring Boot – 环境@Autowired抛出NullPointerException
- 使用Stream API在每个对象上调用方法的“好”方法
- 你能用long int索引数组吗?
- “私人包裹”是什么意思?
- 用于AWT / Swing的Java JDK 1.7中的Apple Retina显示支持