    01: import java.util.*;
    02:
    03: /**
    04:    This runnable executes a sort algorithm.
    05:    When two elements are compared, the algorithm
    06:    pauses and updates a panel.
    07: */
    08: public class Sorter implements Runnable
    09: {
    10:    public Sorter(Object[] values, ArrayPanel panel,
    11:       Gate gate)
    12:    {
    13:       this.values = values;
    14:       this.panel = panel;
    15:       this.gate = gate;
    16:    }
    17:
    18:    public void run()
    19:    {
    20:       Comparator comp = new
    21:          Comparator()
    22:          {
    23:             public int compare(Object o1, Object o2)
    24:             {
    25:                panel.setValues(values, o1, o2);
    26:                try
    27:                {
    28:                   if (gate.isActive())
    29:                      gate.waitForOpen();
    30:                   else
    31:                      Thread.sleep(DELAY);
    32:                }
    33:                catch (InterruptedException exception)
    34:                {
    35:                   Thread.currentThread().interrupt();
    36:                }
    37:                return ((Integer) o1).compareTo(o2);
    38:             }
    39:          };
    40:       MergeSorter.sort(values, comp);
    41:       panel.setValues(values, null, null);
    42:    }
    43:
    44:    private Object[] values;
    45:    private ArrayPanel panel;
    46:    private Gate gate;
    47:    private static final int DELAY = 100;
    48: }