Package org.encog.engine.concurrency.job

Source Code of org.encog.engine.concurrency.job.ConcurrentJob

/*
* Encog(tm) Core v2.5 - Java Version
* http://www.heatonresearch.com/encog/
* http://code.google.com/p/encog-java/
* Copyright 2008-2010 Heaton Research, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*  
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/

package org.encog.engine.concurrency.job;

import org.encog.engine.StatusReportable;
import org.encog.engine.concurrency.EngineConcurrency;
import org.encog.engine.concurrency.TaskGroup;

/**
* This class forms the basis for a job that can be run concurrently.
*/
public abstract class ConcurrentJob {

  /**
   * The class to report status to.
   */
  private final StatusReportable report;

  /**
   * The number of tasks in this job.
   */
  private int totalTasks;

  /**
   * The current task.
   */
  private int current;

  /**
   * Flag to note that the job should stop.
   */
  private boolean shouldStop = false;

  /**
   * Construct a concurrent job.
   *
   * @param report
   *            The object to report status to.
   */
  public ConcurrentJob(final StatusReportable report) {
    this.report = report;
    this.current = 1;
  }

  /**
   * Load the subtasks.
   *
   * @return The total number of subtasks.
   */
  public abstract int loadWorkload();

  /**
   * Perform one job unit.
   *
   * @param context
   *            The context for the job unit.
   */
  public abstract void performJobUnit(JobUnitContext context);

  /**
   * Process the job.
   */
  public void process() {
    Object task;

    this.totalTasks = loadWorkload();
    int currentTask = 0;
    TaskGroup group = EngineConcurrency.getInstance().createTaskGroup();

    while (((task = requestNextTask()) != null) && !shouldStop) {
      currentTask++;
      final JobUnitContext context = new JobUnitContext();
      context.setJobUnit(task);
      context.setOwner(this);
      context.setTaskNumber(currentTask);

      final JobUnitWorker worker = new JobUnitWorker(context);
      EngineConcurrency.getInstance().processTask(worker, group);
    }

    group.waitForComplete();

    EngineConcurrency.getInstance().checkError();
  }

  /**
   * Report the status for this job.
   *
   * @param context
   *            The job context.
   * @param status
   *            The status to report.
   */
  public void reportStatus(final JobUnitContext context,
      final String status) {
    this.report.report(this.totalTasks, current++, status);
  }

  /**
   * Request the next task to be processed.
   *
   * @return The next task to be processed.
   */
  public abstract Object requestNextTask();

  /**
   * @return True if the process should stop.
   */
  public boolean getShouldStop() {
    return this.shouldStop;
  }

  /**
   * Request the process to stop.
   */
  public void stop() {
    this.shouldStop = true;
  }
}
TOP

Related Classes of org.encog.engine.concurrency.job.ConcurrentJob

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.