首页编程java编程java任务调度是做什么?java 多线程是什么

java任务调度是做什么?java 多线程是什么

编程之家2023-10-1296次浏览

大家好,如果您还对java任务调度是做什么不太了解,没有关系,今天就由本站为大家分享java任务调度是做什么的知识,包括java 多线程是什么的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

java任务调度是做什么?java 多线程是什么

java 多线程是什么

线程定义比较抽象,简单的说就是一个代码执行流。许多执行流可以混合在一起由CPU调度。线程是允许各种任务交互执行的方式。

Java的线程在操作系统的实现模式依系统不同而不同,可能是系统级别的进程或线程,但对于程序员来说并没有影响。

任务交互的一个好处是增加程序响应。如一个界面程序执行一段耗时的数据库查询,使用单独的线程可以让界面依然响应用户的其他输入,而单线程只能等待查询结束再处理。

java任务调度是做什么?java 多线程是什么

JVM以及操作系统会优先处理优先级别高的线程,但不代表这些线程一定会先完成。设定优先级只能建议系统更快的处理,而不能强制。

另外,在运行时,并没有按照函数分界,而是按照机器码/汇编码分界。也就是说不保证任何一段代码是被完整而不打断的执行的(除非你已经使用同步手段)。正由于如此,各种线程同步的方法应运而生。

用java里timer执行定时任务,怎么写

这个是我在网上找的不知道是不是你要的:

java任务调度是做什么?java 多线程是什么

java定时任务Timer关于定时任务,似乎跟时间操作的联系并不是很大,但是前面既然提到了定时任务,索性在这里一起解决了。设置定时任务很简单,用Timer类就搞定了。一、延时执行首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行。代码如下:

package test;

import java.util.Timer;

public class TimeTaskTest{

public static void main(String[] args){ Timer timer= new Timer();

timer.schedule(new Task(), 60* 1000);

}

}

解释一下上面的代码。上面的代码实现了这样一个功能,当TimeTask程序启动以后,过一分钟后执行某项任务。很简单吧:先new一个Timer对象,然后调用它的schedule方法,这个方法有四个重载的方法,这里我们用其中一个,

public void schedule(TimerTask task,long delay)

首先,第一个参数第一个参数就是我们要执行的任务。这是一个TimerTask对象,确切点说是一个实现TimerTask的类的对象,因为TimerTask是个抽象类。上面的代码里面,Task就是我们自己定义的实现了TimerTask的类,因为是在同一个包里面,所以没有显性的import进来。Task类的代码如下

package test;

import java.util.TimerTask;

public class Task extends TimerTask{ public void run()

{

System.out.println("定时任务执行");

}

}

我们的Task必须实现TimerTask的方法run,要执行的任务就在这个run方法里面,这里,我们只让它往控制台打一行字。第二个参数第二个参数是一个long型的值。这是延迟的时间,就是从程序开始以后,再过多少时间来执行定时任务。这个long型的值是毫秒数,所以前面我们的程序里面,过一分钟后执行用的参数值就是 60* 1000。二、循环执行设置定时任务的时候,往往我们需要重复的执行这样任务,每隔一段时间执行一次,而上面的方法是只执行一次的,这样就用到了schedule方法的是另一个重载函数public void schedule(TimerTask task,long delay,long period)

前两个参数就不用说什么了,最后一个参数就是间隔的时间,又是个long型的毫秒数(看来java里涉及到时间的,跟这个long是脱不了干系了),比如我们希望上面的任务从第一次执行后,每个一分钟执行一次,第三个参数值赋60* 1000就ok了。三、指定执行时间既然号称是定时任务,我们肯定希望由我们来指定任务指定的时间,显然上面的方法就不中用了,因为我们不知道程序什么时间开始运行,就没办法确定需要延时多少。没关系,schedule四个重载的方法还没用完呢。用下面这个就OK了:

public void schedule(TimerTask task,Date time)

比如,我们希望定时任务2006年7月2日0时0分执行,只要给第二个参数传一个时间设置为2006年7月2日0时0分的Date对象就可以了。有一种情况是,可能我们的程序启动的时候,已经是2006年7月3日了,这样的话,程序一启动,定时任务就开始执行了。schedule最后一个重载的方法是public void schedule(TimerTask task,Date firstTime,long period)

没必要说什么了吧:)四、j2ee中的定时任务在实际的项目中,往往定时任务需要对web工程中的资源进行操作,这样一来,用上面的单个程序的方式可能就有点力不从心了,因为很多web工程的资源它操作不到。解决的办法是,使用Servlet,把执行定时任务的那些代码放到Servlet的init()函数里就可以了,这个easy,就没有必要再写示例代码了吧

Java实时多任务调度过程中的安全监控设计

在一系列关联的多任务的实时环境中如果有一个任务发生失败可能导致所有任务产生连锁反应从而造成调度失控的局面特别是对于核心控制设备尤其重要为了解决这个问题必须对每个任务进行实时监控

问题分析

在JAVA环境中一个任务一般是由一个独立线程来引导实现的独立线程可能调用一系列子线程如果在执行过程中某一个线程发生异常(产生的原因很多比如软件升级运行环境改变系统资抢占等)那么该线程就会停止运行直到下次任务重新被提交对于实时环境来说当前任务是失败的我们无法预测和完全避免异常的发生但是可以通过一些技术手段来跟踪任务的状态从而及时发现问题并恢复正常减少损失

设计原理

对于一个实时任务而言执行效率是非常关键的这意味着不可能考虑用非常复杂的方式来实现任务监控即使这样可以做的比较完善同时监控代码本身也会引入一些异常这就要求监控程序必须简单可靠能够发现大多数问题并能及时处理

一个可能的简单实现

我们对每个任务加上一个监控的壳调度程序调用这个壳来完成对具体任务的引导和监控相当于每个任务具有自治能力这样做的好处有

分散控制不需要修改调度主体程序不增加调度过程的复杂度控制灵活安全性高对于不同任务可定义不同控制方式和控制参数封装在任务内部灵活性好对个别任务控制代码的修改不会影响其他任务即任务控制实现松藕合避免错误扩散适合团队开发维护简单升级方便对于新的任务加入也无需改变原来调度程序的结构只需修改任务表及相关参数这样在性能提高的同时也简化了软件升级过程中的代码维护量

设计实现

每个线程理论上有四种状态

new线程对象已经创建但尚未启动不可运行 runnable一旦有时间分片机制有空闲的CPU周期线程立即开始运行 dead从run()方法退出后一个线程即消亡 blocked线程可运行但有某种东西阻碍了它调度机制不给它分配任何CPU时间直到它进入runnable状态

在实际操作中为了便于描述我们重新规定了线程的状态

Actived线程已被激活处于运行状态 Sleeping线程完成一个特定任务后退出进入休眠状态 Dead线程运行过程中发生异常终止运行处于死亡状态

根据上述理论我们只需要对Actived状态的线程进行监控也只有对Actived状态监控才有意义这是对监控模块做出逻辑简化那么如何实现监控模块对具体任务的监控呢?

对具体任务的监控方式有多种根据任务的不同需要采用不同的监控代码但是在结构上基本相同这和类的重载概念有点相似本文附有一个简单的例子

A任务每秒执行一个简单的代数运算 j=/ i并打印结果我们故意在其中设置了一个异常陷阱使得执行过程中出现一次被除的算术异常下面结合这个例子讲述监控原理

为了监控A我们设计了一个监控线程M M中定义了一些关键逻辑变量

Keepchecking持续监控标志 laststatus保存上次监控状态 maydeadtimes监控线程可能死亡的计数器 maydeadtimeout定义判断线程死亡的边界条件 deadtimes监控线程死亡次数的计数器 deadtimeout定义判断线程不正常的边界条件

为了适应监控在A任务中相应增加一些可以被监控的状态和行为

dead死状态标志 dead=!dead;改变状态

整个监控就是围绕这些状态标志和行为展开的 A任务定期修改自己的dead标志 dead是一个布尔变量理论上只要A没有死那么dead肯定是周期变化的(和心跳概念差不多) M需要做的就是监控dead的变化为了避免一些偶然因素导致的误判我们在M中设置了一些计数器和边界值(maydeadtimes和maydeadtimeout)当M发现A的可能死亡次数超过一定限制后判断A已死亡不在继续等待了作为实时处理首先注销A的实例然后重新启动A(和我们计算机死机的复位很像)然后进入新一轮监控

如果是因为系统偶然因素导致A死亡那么在随后的新的任务启动过程中一般可以顺利完成但是万一由于环境参数改变或软件升级存在版本缺陷 A可能始终会产生异常那么M是否需要耐心地监控下去呢?一个形象的例子是如果你连续次开机都失败你是否会怀疑机器有问题?当然你会那么M也应该会

为了对A任务重复多次死亡有一个统计 M中又引入了另外对计数器和边界值(deadtimes和deadtimeout)和你开计算机的过程一样如果连续n次都发现A有问题可以基本肯定不是由于偶然因素引起的需要对A的代码或系统的环境进行检查 M会发出告警通知必须要对A进行审查了然后清空A自己自动安全退出如果在核心调度程序中设置一个标志接受M们的告警就可以有足够理由终止其他任务的执行可以看见在A任务发生异常期间 M承担了核心调度程序的维护功能特别是当任务数量比较多的情况核心调度程序只能采用排队方式处理任务异常而且由于处理异常的复杂程度不同无法保证对多任务异常的实时处理

还要考虑正常情况下A和M的关系核心调度程序通过M启动A任务后 M处于持续监控状态当A正常结束任务后 A需要通知M结束监控这样当A进入休眠状态后 M也不会占用内存空间提高了系统资源的利用率

通过以上描述可以看到上述监控思想具有清晰的概念和可操作性占用资源少为保证系统连续稳定运行创造了条件

具体代码实现附后

运行结果如下

异常情况正常情况 i=: status=true M read A status= true i=: status=false M read A status= false i=: status=true M read A status= true A bee Exception! M read A status= true M read A status= true M read A status= true A is deaded! M is restarting A! ____________________________ i=: status=false M read A status= false i=: status=true M read A status= true i=: status=false M read A status= false A bee Exception! M read A status= false M read A status= false M read A status= false A is deaded! M is restarting A! ____________________________ i=: status=true M read A status= true i=: status=false M read A status= false i=: status=true M read A status= true A bee Exception! M read A status= true M read A status= true M read A status= true Alert! A is unstable M will stop it(结束) i=: status=true M read A status= true i=: status=false M read A status= false i=: status=true M read A status= true i=: status=false M read A status= false i=: status=true M read A status= true A is Ending M M read A status= true(结束)

结束语

通过给制定任务线程增加监控线程可以很好地解决实时多任务环境下的安全监控问题同时避免了核心调度线程事务过分复杂的问题实践证明该方法复杂度小占用资源少运行可靠适合复杂条件下的多任务环境

源代码

lishixinzhi/Article/program/Java/gj/201311/27589

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

java对象为什么要初始化?java语言为什么要对对象初始化呢java中的rw 什么意思(这段JAVA代码是什么意思)