我正在使用ScheduledExecutorService
来调度多个java作业。我想知道在以下情况下会发生什么:
如果我在使用,
运行命令,长首字母延迟,长周期,时间单位
用于调度5个线程池大小为1的作业
p1-5(以分钟为单位的执行间隔)
p2-5
p3-5
p4-7
p5-10
5分钟后,p1、p2和p3将激活争用。
将作业分配给一个可用线程使用什么算法?他们会以循环方式分配吗?
现在在第7分钟,假设p1和p2完成,p4变为活动状态,但p3占用大量内存,并最终使用整个内存,那么我假设调度程序本身由于内存不足而无法调度。有没有办法确保为调度程序保留一些内存?
5分钟后任务之间不会有争夺。
任务被传递到队列中,如果没有可用的线程来执行它们,它们将按照FIFO顺序执行,至少给定了ScheduledThreadPoolExecutor
实现。
请注意,如果存在未处理的异常,挂起的任务可能会被“静默”取消。
运行命令,长首字母延迟,长周期,时间单位
创建并执行一个周期性动作,该动作在给定的初始延迟后首先启用,然后在给定的时间段内启用;也就是说,执行将在initialDelay之后开始,然后是initialDelay period,然后是initialDelay 2*period,依此类推。
如果任务的任何执行遇到异常,后续执行将被禁止。否则,任务只会通过取消或终止执行者来终止。如果此任务的任何执行时间长于其周期,则后续执行可能会延迟开始,但不会并发执行。
内存已经为调度程序实例保留,如果任务用完了所有剩余的内存,JVM将不会从调度程序中为它们分配内存。这可能会导致OutOfMemoryError。
编辑
如果池中只有一个线程,则会计划任务p2和p3,但在有可用线程之前不会执行这些任务。
请看下面的代码示例:
private static final ScheduledExecutorService scheduledService = Executors.newSingleThreadScheduledExecutor();
public static void main(String[] args) {
scheduledService.submit(() -> {
System.out.println("p1");
try
{
TimeUnit.SECONDS.sleep(15);
} catch (Exception e) {}
});
scheduledService.scheduleAtFixedRate(()-> System.out.println("p2"), 1, 5, TimeUnit.SECONDS);
}
}
一旦p1完成,p2将立即输出三次,这表明任务已计划,但无法在请求的时间执行。
###############################################################################################################
所以答案取决于您正在使用的具体实现。如果您使用Executors.newschduledThreadPool
,那么您实际上是在使用schduledThreadPoolExec导师
。javadoc说:
按先进先出(FIFO)提交顺序启用计划执行时间完全相同的任务。
我不确定我是否理解你关于记忆的第二个问题——要么你有足够的记忆,要么你没有。如果你没有,你会得到一个OutOfMemory错误。
先来先服务(FCFS, First Come First Serve) 短作业优先(SJF, Shortest Job First) 最高优先权调度(Priority Scheduling) 时间片轮转(RR, Round Robin) 多级反馈队列调度(multilevel feedback queue scheduling) 常见的调度算法总结:http://www.jianshu.com/p
主要内容:优点,缺点轮循调度算法是最流行的调度算法之一,它可以在大多数操作系统中实际实现。 这是先到先得的排程先发制人的版本。 该算法着重于时间共享。 在这个算法中,每个进程都以循环方式执行。 在称为时间量的系统中定义了一定的时间片。 就绪队列中的每个进程都分配给该时间段的CPU,如果在该时间内进程的执行完成,那么进程将终止,否则进程将返回就绪队列并等待下一轮完成 执行。 优点 它可以在系统中实际实现,因为它不依赖于
RR 调度算法实现 RR调度算法的调度思想 是让所有runnable态的进程分时轮流使用CPU时间。RR调度器维护当前runnable进程的有序运行队列。当前进程的时间片用完之后,调度器将当前进程放置到运行队列的尾部,再从其头部取出进程进行调度。RR调度算法的就绪队列在组织结构上也是一个双向链表,只是增加了一个成员变量,表明在此就绪进程队列中的最大执行时间片。而且在进程控制块proc_struct
调度框架和调度算法设计与实现
问题内容: 我真的很好奇JVM如何与线程一起使用!在互联网上搜索时,我发现了一些有关RTSJ的材料,但我不知道这是否是正确答案。我还在sun的论坛http://forums.sun.com/thread.jspa?forumID=513&threadID=472453中找到了这个主题 ,但这并不令人满意。 有人可以给我一些有关JVM调度算法的指导,材料,文章或建议吗? 我还在寻找有关调度程序中Ja
在以下示例中,有六个进程分别命名为P1,P2,P3,P4,P5和P6。 他们的到达时间和爆发时间如下表所示。 系统的时间量是4个单位。 进程ID 到达时间 突发时间 1 0 5 2 1 6 3 2 3 4 3 1 5 4 5 6 6 4 根据算法,我们必须保持就绪队列和甘特图。 两个数据结构的结构在每次调度后都会改变。 就绪队列: 最初,在时间,过程P1到达,其将被安排为时间片4单位。 因此,在就