主要分两步:一、在Linux环境中一直运行一个线程。二、如何控制java代码同时执行多个工作线程。
一、可以用Linux中的 nohup 命令,控制该线程就算在终端被关闭或者账户退出之后,继续在后台运行该线程,nohup 命令运行由Command参数和任何相关的Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。控制该线程在Linux环境中不会被挂起。
退出该线程的状态是Command参数指定命令的退出状态,即当所运行的java代码内容全部完成,线程全部退出时nohup结束。
二、对java代码中的线程池控制用Quartz框架对java中的Job进行控制。
一个Quartz的使用事例代码如下:
import java.util.Date;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import com.hefeng.quartz.quartzjob.QuartzJob;
import com.hefeng.quartz.quartzjob.QuartzJob1;
/**
* 用Trigger调度任务
* @author hefeng
*/
public class TriggerTest {
public static void main(String[] args) throws SchedulerException, ClassNotFoundException {
PropertyConfigurator.configure("E:/project/p2pProject/Bill_Account_Config/system/etc/log4jlog.properties");
Logger log = Logger.getLogger(TriggerTest.class);
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
//Schedule接口 实现调度器
Scheduler scheduler = schedulerFactory.getScheduler();
// Class<Job> claz = (Class<Job>)Class.forName("com.hefeng.quartz.quartzjob.QuartzJob");
//用jobBuilder类实例化JobDetail接口
JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class).withIdentity("quartzJob","quartzJob").build();
JobDetail jobDetail1 = JobBuilder.newJob(QuartzJob1.class).withIdentity("quartzJob1","quartzJob").build();
//Trigger为触发器
log.info("aaaa");
SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("simpleTrigger","simpleTrigger")
.startAt(new Date())
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1).repeatForever()).build();
SimpleTrigger simpleTrigger1 = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("simpleTrigger1","simpleTrigger")
.startAt(new Date())
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1).repeatForever()).build();
scheduler.scheduleJob(jobDetail, simpleTrigger);
scheduler.scheduleJob(jobDetail1, simpleTrigger1);
scheduler.start();
try {
Thread.sleep(10000); //主线程休眠,但是job调度作业继续运行
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
scheduler.shutdown();
}
}
Quartz框架主要可分为调度器、作业、触发器等。
1、Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。Quartz依赖一套松耦合的线程池管理部件来管理线程环境。
2、作业为实现Job接口的类,重写其中的 execute(JobExecutionContext context) 方法,方法体即为作业内容。
3、Trigger作为触发器,对作业进行实例化。