0

参考Java Timer ClassScheduledExecutorService 接口,我可以在执行线程(其他调度程序)的运行方法(或 TimerTask)内部设置调度程序(或计时器)吗?

案例研究:我有一个数据库,其中包含歌曲列表(10,000)和播放歌曲的时间安排。

所以我想创建一个调度程序(比如 1)(周期 1 小时),它将搜索数据库并为计划在一小时内播放的所有歌曲创建调度程序。

一小时后,scheduler1 将删除所有线程并再次搜索数据库并为其他线程创建调度程序。

这是个好主意吗?可以创建吗?

或者我应该一次创建 10000 个调度程序?

在这种情况下,哪一个将是更好的计时器或调度程序?

4

1 回答 1

1

为什么不直接调用ScheduledExecutorService.scheduleAtFixedRateScheduledExecutorService.scheduleWithFixedDelay呢?

更新

这是实现(我相信)您想要的一种方法:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

void start(final Connection conn)
{
  executor.scheduleWithFixedDelay(new Runnable(){ public void run(){ try { poll(conn); } catch (Exception e) { e.printStackTrace(); } } }, 0, 1, TimeUnit.HOURS);
}

private void poll(Connection conn) throws SQLException
{
  final ResultSet results = conn.createStatement().executeQuery("SELECT song, playtime FROM schedule WHERE playtime > GETDATE() AND playtime < GETDATE() + 1 HOUR");
  while (results.next())
  {
    final String song = results.getString("song");
    final Time time = results.getTime("playtime");

    executor.schedule(new Runnable(){ public void run() { play(song); } }, time.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
  }
}
于 2013-06-28T10:47:46.123 回答