FileDocCategorySizeDatePackage
ThreadedSolver.javaAPI DocExample3153Sun Jan 04 23:11:00 GMT 1998dcj.examples

ThreadedSolver.java

package dcj.examples;

import dcj.examples.ProblemSet;
import dcj.examples.Solver;
import java.lang.Runnable;
import java.io.*;

public class ThreadedSolver implements Runnable, Solver
{
  // Protected implementation variables
  protected ProblemSet currProblem = null;
  protected OutputStream clientOut = null; // Destination for solutions
  protected InputStream clientIn = null;   // Source of problems
  
  // Constructors
  public ThreadedSolver(InputStream cin, OutputStream cout)
  {
    super();
    clientIn = cin;
    clientOut = cout;
  }
  
  public boolean Solve()
  {
    boolean success = true;
    SimpleCmdInputStream sin = new SimpleCmdInputStream(clientIn);
    String inStr = null;
    try
      {
        System.out.println("Reading from client...");
        inStr = sin.readString();
      }
    catch (IOException e)
      {
        System.out.println("Error reading data from client.");
        return false;
      }
    
    if (inStr.compareTo("problem") == 0)
      {
        try
          {
            inStr = sin.readString();
          }
        catch (IOException e)
          {
            System.out.println("Error reading data from client.");
            return false;
          }
            
        System.out.println("Got \"" + inStr + "\" from client.");
        double problem = Double.valueOf(inStr).doubleValue();
        ProblemSet p = new ProblemSet();
        p.setValue(problem);
        success = Solve(p);
      }
    else
      {
        System.out.println("Error reading problem from client.");
        return false;
      }
    
    return success;
  }
  
  public boolean Solve(ProblemSet s)
  {
    boolean success = true;
    
    if (s == null)
      {
        System.out.println("No problem to solve.");
        return false;
      }
    
    System.out.println("Problem value = " + s.getValue());
    
    // Solve problem here...
    try
      {
        s.setSolution(Math.sqrt(s.getValue()));
      }
    catch (ArithmeticException e)
      {
        System.out.println("Badly-formed problem.");
        success = false;
      }
    
    System.out.println("Problem solution = " + s.getSolution());
    System.out.println("Sending solution to output...");
    
    // Write the solution to the designated output destination
    try
      {
        DataOutputStream dout = new DataOutputStream(clientOut);
        dout.writeChars("solution=" + s.getSolution() + "\n");
      }
    catch (IOException e)
      {
        System.out.println("Error writing results to output.");
        success = false;
      }
    
    return success;
  }
  
  public boolean Problem(ProblemSet s)
  { currProblem = s; return true; }
  
  public boolean Iterations(int dummy) // Not used on this solver
  { return false; }
  
  public void PrintResults(OutputStream os)
  {
    PrintStream pos = new PrintStream(os);
    pos.println("Problem solution: " + currProblem.getSolution());
  }
  
  public void run()
  {
    System.out.println("ThreadedSolver::run()...");
    Solve();
  }
}