当前位置: 首页 > 知识库问答 >
问题:

Java调度算法

傅振濂
2023-03-14

我正在使用ScheduledExecutorService来调度多个java作业。我想知道在以下情况下会发生什么:

如果我在使用,

运行命令,长首字母延迟,长周期,时间单位

用于调度5个线程池大小为1的作业

p1-5(以分钟为单位的执行间隔)

p2-5

p3-5

p4-7

p5-10

5分钟后,p1、p2和p3将激活争用。

将作业分配给一个可用线程使用什么算法?他们会以循环方式分配吗?

现在在第7分钟,假设p1和p2完成,p4变为活动状态,但p3占用大量内存,并最终使用整个内存,那么我假设调度程序本身由于内存不足而无法调度。有没有办法确保为调度程序保留一些内存?

共有2个答案

翟聪
2023-03-14

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将立即输出三次,这表明任务已计划,但无法在请求的时间执行。

尉迟正平
2023-03-14

###############################################################################################################

所以答案取决于您正在使用的具体实现。如果您使用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单位。 因此,在就