- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
Jersey
应用程序Tomcat
服务器上运行Hibernate
连接到 MySQL
数据库Netbeans
我正在创建一个 ScheduledExecutorService
来每天在特定时间运行。但是,当它运行时,它会创建许多与数据库的连接。我想这是因为当我重新运行应用程序时线程没有被销毁,所以许多 ScheduledExecutorService
在 JVM 中构建并且全部同时执行。但是,我不确定原因是什么。
我使用仅创建守护线程的 ThreadFactory
创建 ScheduledExecutorService
,因此当我重新运行应用程序时,我认为所有守护线程都应该被销毁,以便只有一个 ScheduledExecutorService
存在。
这里是 ScheduledExecutorService
的创建:
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = Executors.defaultThreadFactory().newThread(r);
t.setDaemon(true);
return t;
}
});
以下是它每天在特定时间运行的方式:
public void startExecutionAt(int targetHour, int targetMin, int targetSec){
long delay = computeNextDelay(targetHour, targetMin, targetSec);
mExecutorService.schedule(new Runnable() {
@Override
public void run() {
Thread t = new Thread(new CustomRunnable());
t.setDaemon(false);
t.start();
startExecutionAt(targetHour, targetMin, targetSec);
}
}, delay, TimeUnit.SECONDS);
}
我知道它正在创建许多与 MySQL
的连接,因为在 P6Spy
日志中,当 CustomRunnable
只运行一个从表中选择 5 条记录的 Hibernate
查询时,执行 CustomRunnable
时会产生许多连接和查询。
对于可能发生的事情有什么想法吗?
最佳答案
你显然滥用了你的ScheduledExecutorService
,这是你应该做的:
public void startExecutionAt(int targetHour, int targetMin, int targetSec){
long delay = computeNextDelay(targetHour, targetMin, targetSec);
mExecutorService.scheduleAtFixedRate(
new CustomRunnable(),
1000L * delay,
TimeUnit.DAYS.toMillis(1),
TimeUnit.MILLISECONDS
);
}
您一次调用此方法,它将以 delay
作为初始延迟启动您的任务,然后每天在同一确切时间启动您的任务。
更多详情here .
事实上,您当前在执行任务时随时创建一个新线程,然后再次调用该方法来安排下一次执行,这不是您应该做的,该任务已经在池中执行,无需创建新的线程
,而且当您可以直接使用ScheduledExecutorService
时,无需再次手动安排。
响应更新:
由于您的情况安排似乎更复杂,因此您应该这样做:
public void startExecutionAt(int targetHour, int targetMin, int targetSec){
long delay = computeNextDelay(targetHour, targetMin, targetSec);
mExecutorService.schedule(new Runnable() {
@Override
public void run() {
try {
new CustomRunnable().run();
} finally {
startExecutionAt(targetHour, targetMin, targetSec);
}
}
}, delay, TimeUnit.SECONDS);
}
这样您就不会无缘无故地创建和启动新线程。
问题的第二部分应该通过分别在初始化和销毁的 ServletContext
上正确启动和关闭 ScheduledExecutorService
来解决,换句话说,管理调度程序的类应该是 ServletContextListener
。
public class MyServletContextListener implements ServletContextListener {
private ScheduledExecutorService executorService;
public void contextInitialized(ServletContextEvent sce) {
executorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = Executors.defaultThreadFactory().newThread(r);
t.setDaemon(true);
return t;
}
});
}
public void contextDestroyed(ServletContextEvent sce) {
executorService.shutdownNow();
}
public void startExecutionAt(int targetHour, int targetMin, int targetSec){
// code defined above here
}
}
如果您需要服务来使其工作,请使用 CDI 通过注入(inject)来获取它们。
关于java - 当我使用 Executors.newSingleThreadScheduledExecutor 创建 ScheduledExecutorService 时,它运行许多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37898117/
这是情况,代码如下 用户填写 3 个字段并按“添加”按钮 => 创建一个 ToDoBean 并将其添加到 ToDoModel(扩展 AbstractTableModel) 并使用模型中 ToDoBea
Quarkus 有一个 https://quarkus.io/guides/scheduler来安排任务。但是,我想使用 ScheduledExecutorService .这在夸克中是允许的吗?例如
我有以下代码: ScheduledExecutorService scheduledExecutor; ..... ScheduledFuture result = scheduledExecutor
我需要实现一个计划执行程序服务,该服务每隔 x 秒运行一个线程。如果线程执行时间超过 y 秒,则应中断线程执行。我尝试使用 ScheduledExecutorService 来实现该解决方案,该服务具
我正在创建一个新线程来检查文件夹中是否有新文件,然后 hibernate 一段定义的时间。 我的首选是使用 ScheduledExecutorService,但是,我找不到任何文档来说明这是否需要等待
如何让 ScheduledExecutorService 在给定时间段内以给定时间速率执行任务? 然后下面的代码将使其以 1 秒的速率执行...但是我如何限制所有这些重复的总周期 service.sc
我意识到,如果在我的可运行对象的 run 方法内部(或没有,但应该与之相关)引发异常,我 future 的所有任务都将不会运行。 所以我的问题是:我如何从这样的异常中恢复(在哪里捕获它)? 我已经尝试
我正在使用预定执行程序服务 私有(private) ScheduledExecutorService 池 = new ScheduledThreadPoolExecutor(1); 以固定速率运行可运
ScheduledExecutorService ScheduledExecutorService 是在主线程还是后台线程上运行,我经历了 documentation here 但没有找到。 任何帮助
我有一个耳朵,将作为后端耳朵部署在多个服务器上。在那个耳朵中,我需要添加 ScheduledExecutorService 以在特定时间从数据库中获取一些记录并处理它们。但我只需要处理一次,而不是在将
我有 ScheduledExecutorService,我正在尝试更新内部数据但没有结果 public void myMethod(final String myString) { myExe
我目前遇到了 ScheduledExecutorService 执行速度快于给定时间范围的问题。 scheduleAtFixedRate声明后续执行可能会延迟,但不会等待给定的时间。 GrabPutT
我正在使用 ScheduledExecutorService.scheduleWithFixedDelay() 来安排线程的定期启动。它可以工作,但线程正在 ThreadStackTrace 中累积(
我有以下代码,每 20 分钟后调用一次任务,并且工作正常。现在,在此之上,我希望它仅在 0900 到 1800 之间工作 ScheduledExecutorService scheduler = Ex
我有一个特定的任务,必须定期执行,或者根据条件仅执行一次。我正在使用以下方法: Runnable r = new Runnable() { public void run()
我有一个 ScheduledExecutorService 来获取定期执行的任务: scheduler = Executors.newScheduledThreadPool( what size? )
以下代码是从 JMenuItem 的 ActionListener 调用的。它只是启动一个 jar 文件。 ScheduledExecutorService schedulerExecutor = E
我有两个每秒运行的执行器服务。但是当我在 run 方法中插入一行代码时,其中一个会停止运行。这是我的类(class): 游戏服务器: public class GameServer implement
提出此问题的动机我正在运行一个在非常昂贵的硬件上运行的大型产品。出于测试目的而关闭它是不可能的,也不可能在生产环境中放置一个坏的 jar。我需要尽可能确保几乎确保我不会弄乱生产环境。 在暂存设置上运行
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我是一名优秀的程序员,十分优秀!