「java动态配置任务」java实现任务调度

博主:adminadmin 2023-01-07 11:06:07 783

今天给各位分享java动态配置任务的知识,其中也会对java实现任务调度进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Java应用程序中如何动态的分配CPU资源?

方案选择

在考虑动态分配CPU资源实施方案时,往往有以下两点要求:

1. 须充分利用现有硬件资源,在系统空闲时,让低优先级任务也能够得到系统所能给予最快响应。

2.当硬件资源超负荷运行时,虽然系统中有大规模、多数量任务不能处理,但它不应受影响,而能够顺利处理那些能够被处理、最重要高优先级任务。

多任务系统要用多线程实现最简单方法就是将线程和任务一一对应,动态调整线程优先级,利用线程调度来完成CPU资源在不同任务间动态分配。这种思路在以前使用本地化代码(Native Code),充分利用特定硬件和操作系统技巧基础上是基本可行。但在跨平台Java环境中,这个思路对仅有小规模任务数简单系统才可行,原因有以下两点:

1. Java线程虽然在编程角度(API)是与平台无关,但它运行效果却和不同操作系统平台密切相关。为了利用更多CPU资源,Java中一个线程(Thread)就对应着不同操作系统下一个真实线程。因为Java虚拟机没有实现线程调度,所以这些Java线程在不同操作系统调度下运行差异性也就比较明显。例如在Windows系统中,不仅线程优先级少于Java API参数规定十个优先级,而且微软明确反对程序员动态调整线程优先级。即使在操作系统中有足够优先权,让线程优先级参数和真实线程优先级对应,不同操作系统调度方式也会有许多不同。这最终会造成代码在不同平台上行为变得不可预测。这就很难满足复杂、大规模并发任务众多优先级需求,从而很难达到用户业务需要达到效果。

2. 由于在Java系统中,线程被包装在一个Java语言对象类—Thread中,所以为了完成Java语言对象和操作系统线程对应,Java线程系统开销还是比较大(在NT 4.0中,平均每个线程大致占用30KB内存)。因此如果让Thread对象个数和成千上万任务数同比例增长,就显然是不合理。

内容摘要:本文利用协调式多任务模型,提出一个与平台无关、并且能在任务间动态分配CPU资源方案。

综上所述,根据并发多任务大规模需求和Java平台固有特点,想要利用Java Thread对象优先级调整CPU资源分配是非常困难,所以应该尽量避免让线程和任务直接对应,也尽量避免使用操作系统线程优先级调度机制。

解决方案

根据以上分析,问题症结在于:多任务系统中任务在Java语言中对应以及任务间相互调度。

 从本质上看,一个任务就是一系列对象方法调用序列,与JavaThread对象或者别类对象没有必然联系。在避免使用不同操作系统线程调度且同时Java虚拟机又没有线程调度能力情况下,要想构造一个协调式多任务系统,让各个任务相互配合就成了最直接思路。协调式多任务系统一般有以下特点:

1. 任务由消息驱动,消息响应代码完成任务逻辑处理;

2. 消息队列完成消息存储和管理,从而利用消息处理次序体现任务优先级不同;

3. 任务中耗时消息响应逻辑能够主动放弃CPU资源,让别任务执行(像Windows 3.1中Yield函数、Visual Basic中DoEvents语句)。

可能出于巧合,Java语言具有构造协调式多任务系统天然条件。Java对象方法不仅是一个函数调用,它还是一个java.lang.reflect.Method类对象。而所有对象方法都可以通过Method类invoke方法调用。如果能使每个任务所对应一系列方法全部以对象形式包装成消息,放到消息队列中,然后再按照自己优先级算法将队列中消息取出,执行其Method对象invoke调用,那么一个基本协调式多任务系统就形成了。其中,任务优先级和线程优先级没有绑定关系。该系统主体调度函数可以设置成一个“死循环”,按照需要优先级算法处理消息队列。对于有多重循环、外设等待等耗时操作消息响应函数,可以在响应函数内部递归调用主体调度函数,这一次调用把原来“死循环”改成在消息队列长度减少到一定程度(或者为空)后退出。退出后,函数返回,执行刚才没有完成消息响应逻辑,这样就非常自然地实现了协调式系统中任务主动放弃CPU资源要求。

Spring boot 动态的配置Scheduling

一:springboot配置静态定时任务

1:pom中添加依赖

2:启动类中加入@EnableScheduling来开启定时任务

3:@Scheduled(cron = "0/10* * * * ?")// 每过10秒执行一次

二: springboot动态配置定时任务:主要动态的配置。

package com.example.demo.config;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.lang.Nullable;

import org.springframework.scheduling.Trigger;

import org.springframework.scheduling.TriggerContext;

import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import org.springframework.scheduling.support.CronTrigger;

import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.concurrent.ScheduledFuture;

@Component

@Configuration

public class DynamicSchedulingConfig {

@Autowired

    private ThreadPoolTaskSchedulerthreadPoolTaskScheduler;

    @Bean

    public ThreadPoolTaskSchedulerthreadPoolTaskScheduler(){

return new ThreadPoolTaskScheduler();

    }

private ScheduledFuturefuture;

    private Stringcron ="";

    public StringgetCron() {

return cron;

    }

public void setCron(String cron) {

this.cron = cron;

        stopCron();

        future =threadPoolTaskScheduler.schedule(new Runnable() {

@Override

              public void run() {

try {

System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

                  }catch (Exception e) {

e.printStackTrace();

                  }

}

}, new Trigger() {

@Nullable

@Override

              public DatenextExecutionTime(TriggerContext triggerContext) {

if("".equals(cron)||cron==null){

return null;

                  }

CronTrigger cronTrigger =new CronTrigger(cron);

                  Date nextExeDate = cronTrigger.nextExecutionTime(triggerContext);

                  return nextExeDate;

              }

});

    }

public void stopCron(){

if(future!=null){

future.cancel(true);

        }

}

}

JAVA程序中定时任务,有没有办法动态控制任务执行的时间间隔!!!!

java可以只用quartz作业调度框架来做定时任务,可以动态控制运行间隔,不需要重启服务器。

java热部署:tomcat运行中,动态修改配置文件(java文件)中的static属性并生效

Context path="/tomcatTest" reloadable="true" docBase="E:\workplace\testProject\WebRoot"/

第一个是容器里的项目path 要加/

第二个参数是你的workplace的路径,一般是到webroot

写个context.xml文件,放到项目的META-INF里.context.xml头部像上面那样写就可以

java中conf.properties为什么能实现动态配置

因为在后台有对这个文件进行加载和解析。把conf.properties这个文件里面的数据全部解析到一个对象里。

然后在其他地方就可以通过这个对象来获取配置属性。

等程序写好后,以后要修改数据,直接在配置文件里修改,程序就不用修改,也不用重新编译了。

关于java动态配置任务和java实现任务调度的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。