ScheduledExecutorService - 任务停止 运行
ScheduledExecutorService - Task stops running
private ScheduledExecutorService pool = new ScheduledThreadPoolExecutor(20);
我是运行任务
public void run() {
if (queue.isEmpty()) return;
ArrayDeque<Profile> current = new ArrayDeque<Profile>();
this.queue.drainTo(current, 20);
MySQLStatement statement = this.wrapper.prepare();
while (!current.isEmpty()) {
if (statement.isClosed()) return;
Profile profile = current.poll();
statement.addBatch(profile.getId().toString(), ProfileBuilder.toJson(profile));
}
statement.executeBatchAsync();
}
使用 ScheduledExecutorService
pool.scheduleAtFixedRate(new VerboseRunnable(runnable = new MySQLRunnable(this)), 250, 50, TimeUnit.MILLISECONDS);
MySQLRunnable 在使用满队列运行一些后停止工作,但当队列为空时它或多或少地无限运行。
首先我认为停止可能是因为静默捕获异常,所以我添加了 VerboseRunnable
public void run() {
try {
runnable.run();
} catch (Throwable e) {
System.err.println("Error in runnable!");
e.printStackTrace();
throw new RuntimeException(e);
}
}
但它仍然停止运行。 ScheduledFuture 还告诉我任务既没有完成也没有取消。
任何帮助都会很好。
您在使用资源时应始终小心关闭资源,尤其是 I/O 连接、语句和结果集等资源。在池环境中,您很容易耗尽连接池,后续任务将最终阻塞,等待可能永远不可用的连接(如果幸运的话,取决于实现等,连接可能会启动在 分钟 ... 或更长时间后自行关闭)。
private ScheduledExecutorService pool = new ScheduledThreadPoolExecutor(20);
我是运行任务
public void run() {
if (queue.isEmpty()) return;
ArrayDeque<Profile> current = new ArrayDeque<Profile>();
this.queue.drainTo(current, 20);
MySQLStatement statement = this.wrapper.prepare();
while (!current.isEmpty()) {
if (statement.isClosed()) return;
Profile profile = current.poll();
statement.addBatch(profile.getId().toString(), ProfileBuilder.toJson(profile));
}
statement.executeBatchAsync();
}
使用 ScheduledExecutorService
pool.scheduleAtFixedRate(new VerboseRunnable(runnable = new MySQLRunnable(this)), 250, 50, TimeUnit.MILLISECONDS);
MySQLRunnable 在使用满队列运行一些后停止工作,但当队列为空时它或多或少地无限运行。
首先我认为停止可能是因为静默捕获异常,所以我添加了 VerboseRunnable
public void run() {
try {
runnable.run();
} catch (Throwable e) {
System.err.println("Error in runnable!");
e.printStackTrace();
throw new RuntimeException(e);
}
}
但它仍然停止运行。 ScheduledFuture 还告诉我任务既没有完成也没有取消。
任何帮助都会很好。
您在使用资源时应始终小心关闭资源,尤其是 I/O 连接、语句和结果集等资源。在池环境中,您很容易耗尽连接池,后续任务将最终阻塞,等待可能永远不可用的连接(如果幸运的话,取决于实现等,连接可能会启动在 分钟 ... 或更长时间后自行关闭)。