Pages

Tuesday 22 January 2013

My Synchronised Queue

I received this task from one recruiter. His client was looking for a java programmer and they wanted to check my knowledge of Java. I should to create a class that represents a synchronised queue.

Here is my version of a linked synchronised queue. I had to create to inner classes as well.



package queue;

/**
 *
 * @author Alex
 */

  /* Synchronised Queue - class SynchQ */
public class SynchQ {
    private final Info inf;
    private boolean IsEmpty;
 
  /* Inner class FIFOnode  */
  final class FIFOnode {
  Object value;
  FIFOnode next;
  
  /* Constructor of FIFOnode  */
  FIFOnode(Object v, FIFOnode n)
  {
     value = v;
     next = n;
  }
}
    final class Info{
  
    FIFOnode head;
    FIFOnode last;
    
    Info(){
       this.last = new FIFOnode(null, null);
       this.head = this.last;
    }
  } 
    
  /* Creates a new Queue object.  */
  public SynchQ ()
  {
    /* TODO: Implement this method.  */
      this.IsEmpty = true;
      this.inf = new Info();
  }
 
  /* Puts an object at the end of the queue.   */
  public void put(Object obj)
  {
    /* TODO: Implement this method.  */
 FIFOnode newNode = new FIFOnode(obj, null);
 synchronized (this.inf)
 {
            this.inf.last.next = newNode;
            this.inf.last = newNode;
 }
       this.IsEmpty = false;
  }
 
 /* Gets an object from the beginning of the queue.  The object is
   * removed from the queue.  If there are no objects in the queue,
   * returns null.
   */
  public Object get()
  {
 Object x = null;
 
        synchronized (this.inf)
 {

          FIFOnode first = this.inf.head.next;

    if (first != null)
    {
     x = first.value;
     this.inf.head = first;
     }
           if (this.inf.head.next == null) this.IsEmpty = true;
        }

 return x;
  }
  
  public boolean isEmpty() {
  return this.IsEmpty;
  }
}

Here is a classes for testing of my queue:

package queue;
/**
 *
 * @author Alex
 */
class SomeClass {
 public int x = 10;
 
 SomeClass(int a){
     this.x = a;
 }
}

public class Queue {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
      SomeClass some1 = new SomeClass(10);
      SomeClass some2 = new SomeClass(20);
      SomeClass some3 = new SomeClass(30);
      SynchQ Q = new SynchQ();
      Q.put(some1);
      Q.put(some2);
      Q.put(some3);
      
      System.out.println(Q.isEmpty());
      
      SomeClass s1;

      if(!Q.isEmpty()) 
      { s1 = (SomeClass)Q.get();
        System.out.println(s1.x);
        System.out.println(Q.isEmpty()); 
      }
      if(!Q.isEmpty()) 
      { s1 = (SomeClass)Q.get();
        System.out.println(s1.x);
        System.out.println(Q.isEmpty()); 
      }
      if(!Q.isEmpty()) 
      { s1 = (SomeClass)Q.get();
        System.out.println(s1.x);
        System.out.println(Q.isEmpty()); 
      }
      System.out.println(Q.isEmpty()+"AAA"); 
      if(!Q.isEmpty()) 
      { s1 = (SomeClass)Q.get();
        System.out.println(s1.x);
        System.out.println(Q.isEmpty()); 
      }
      
    }
}

No comments:

Post a Comment