该类为解决界面实时校验慢写的,但不限于此,可以执行后台逻辑

</pre><pre name="code" class="java">/**
 * 该类为解决界面实时校验慢写的,但不限于此,可以执行后台逻辑。<br>
 * <br>
 * 效果是:<br>
 * 在校验触触发结束后一段时间执行最近一次job中的逻辑,废弃之前的<br>
 * 逻辑,避免了逻辑随着界面频繁的修改而多次执行导致的资源消耗问题
 * 
 * @author hunan
 */
public abstract class LazyJob
{
    /**
     * job名称
     */
    private String name = "lazy job"; //$NON-NLS-1$
    
    /**
     * 已被schedule的oldJob
     */
    private Job oldJob = null;
    /**
     * 当前的job
     */
    private Job job = null;
    
    /**
     * 是否UIJob
     */
    private final boolean isUIJob;
    
    /**
     * 构造函数
     * 
     * @param name job名称
     * @param isUIJob 是否为UIJob,如果是执行界面逻辑传true
     */
    protected LazyJob(String name, boolean isUIJob)
    {
        this.name = name;
        this.isUIJob = isUIJob;
    }
    
    /**
     * 构造函数
     * 
     * @param isUIJob 是否为UIJob,如果是执行界面逻辑传true
     */
    protected LazyJob(boolean isUIJob)
    {
        this.isUIJob = isUIJob;
    }

    /**
     * @return 获取内部Job,没有则新建
     */
    public Job getJob()
    {
		if (job != null) {
			return job;
		}
        if (isUIJob)
        {
            return job = new UIJob(name)
            {
                @Override
                public IStatus runInUIThread(IProgressMonitor monitor)
                {
                    if (monitor.isCanceled())
                    {
                        return Status.CANCEL_STATUS;
                    }
                    return doRun(monitor);
                }
            };
        }
        return job = new Job(name)
        {
            @Override
            protected IStatus run(IProgressMonitor monitor)
            {
                if (monitor.isCanceled())
                {
                    return Status.CANCEL_STATUS;
                }
                return doRun(monitor);
            }
        };
    }

    /**
     * 取消Job
     */
    private void cancel()
    {
        if (oldJob != null)
        {
        	oldJob.cancel();
        }
    }
    
    /**
     * 重启job<br>
     * 如果之前已经存在job,则取消。新起一个job
     * 
     * @param delay 延迟的时间
     */
    public void schedule(final long delay)
    {
        cancel();
        getJob().schedule(delay);
        oldJob = job;
        job = null;
    }
    
    /**
     * 子类重写字方法实现具体逻辑
     * 
     * @param monitor
     */
    protected abstract IStatus doRun(IProgressMonitor monitor);
};


复制去Google翻译 翻译结果
回报
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值