在Java中安排定期任务,避免在必要时创建新线程(如CachedThreadPool)

ver*_*lav 7 java concurrency multithreading scheduled-tasks threadpool

我有许多任务,我想以不同的速率定期执行大多数任务.但是可以安排一些任务同时执行.此外,任务可能需要在另一个当前正在执行时开始执行.

我还想通过为它设置一个对象来自定义每个任务,任务将在执行时运行.

通常,任务将在2到30分钟的时间内执行,大约需要4-5秒,执行时有时需要30秒.

我发现Executors.newSingleThreadedScheduledExecutor(ThreadFactory)几乎正是我想要的,除非它可能会导致我的问题,如果一个新任务恰好被安排执行而另一个已经在执行.这是因为Executor由单个执行线程备份.

另一种方法是使用Executors.newScheduledThreadPool(corePoolSize, ThreadFactory),但这需要我在池中创建许多线程.我想避免在必要之前创建线程,例如,如果由于冲突的执行计划而导致需要并行执行两个或更多任务.

对于上面的情况,Executors.newCachedThreadPool(ThreadFactory)似乎做我想要的,但后来我无法安排我的任务.我认为,高速缓存和预定执行程序的组合最好,但我无法在Java中找到类似的东西.

你认为实施上述的最佳方法是什么?

Tom*_*icz 1

不是ScheduledThreadPoolExecutor.ScheduledThreadPoolExecutor(int)

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(0);
Run Code Online (Sandbox Code Playgroud)

你需要什么?0是个corePoolSize

corePoolSize- 保留在池中的线​​程数,即使它们处于空闲状态,除非allowCoreThreadTimeOut已设置