专用ScheduledExecutorService池=新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资源。在池环境中,您很容易耗尽连接池,后续任务最终将阻塞,等待可能永远不可用的连接(如果幸运的话,取决于实现等,连接可能会在几分钟后…或更长时间后开始关闭)。
问题内容: 在ScheduledExecutorService中运行时,是否有种不错的方法可以阻止任务内部重复任务? 可以说,我有以下任务: 从外部,很容易通过f.cancel()取消,但是如何在指定的位置停止重复?(通过AtomicReference传递Future是不安全的,因为当scheduleAtFixedRate返回f较晚并且变量也设置得较晚时,存在一个潜在的窗口,并且任务本身可能已经运
问题内容: 在ScheduledExecutorService中运行时,是否有种不错的方法可以阻止任务内部重复任务? 可以说,我有以下任务: 从外部,很容易通过f.cancel()取消,但是如何在指定的位置停止重复?(通过AtomicReference传递Future是不安全的,因为当scheduleAtFixedRate返回f late并且变量也被延迟设置时,存在一个潜在的窗口,并且任务本身可能
问题内容: 该程序在九次打印后完成: 如何停止进程(例如eclipse中的Java进程),因为它在9秒的时间限制后没有停止? 问题答案: 您遇到的问题是,取消哔声任务后,调度程序会保留活动线程。 如果存在活动的非守护程序线程,则JVM保持活动状态。 它使该线程保持不变的原因是您已在此行中告诉它这样做: 请注意以下文档: -即使在空闲状态下要保留在池中的线程数。 因此,您有两种可能的方法来导致J
我正在使用ScheduledExecutorService并对其进行初始化(ScheduledExecutorService scheduledThreadPool=Executors.NewScheduledThreadPool(20);)这样我就不会每次都创建新线程。然后,我使用计划“executorService.schedule(new Runnable(),20,timeUnit.sec
stop-task 命令用于停止数据迁移任务。有关 stop-task 与 pause-task 的区别,请参考暂停数据迁移任务中的相关说明。 help stop-task stop a specified task Usage: dmctl stop-task [-s source ...] <task-name | task-file> [flags] Flags: -h, --hel
当我把逻辑放在一个可运行的线程中时,它工作得很好,只是我不能与UI线程交互。所以我试图把所有的东西都放在一个类中,这个类扩展了Task,除了Task只执行一次之外,其他的都可以工作。没有错误,我从Task successed方法获得一条successed消息。 我还尝试在call方法中使task return Boolean为true,但这没有帮助。 请注意,此代码实际上存在于控制器中,但我将其放