001    /*
002     * @(#)ConcurrentList.java  0.1 03/05/19
003     *
004     * Copyright (c) 2003 Arno Formella and Jose B. Gonzalez Lopez.
005     * All Rights Reserved.
006     *
007     * LGPL
008     * 
009     */
010    
011    /* a possible package location */
012    // package es.uvigo.ei.cd.java.util.concurrent;
013    
014    import java.util.*;
015    
016    /**
017       Program to test the implementation of the ConcurrentList data structure.
018    
019       @author  Arno Formella and José B. González López
020       @version 0.1, 05/19/03
021     */
022    public class TestThread implements Runnable {
023      static final int PR_SIZE=100;
024      public static ConcurrentList concurrentList;
025      private ConcurrentItem privateList[];
026      String name = "";
027    
028      TestThread(String n) {
029        name = n;
030        privateList = new ConcurrentItem[PR_SIZE];
031        for(int i = 0; i<PR_SIZE; i++)
032          privateList[i] = null;
033      }
034        
035      public void run() {
036        for(int i = 0; i<PR_SIZE; i++)
037          privateList[i] = null;
038        try {
039          for(int i = 1; i<PR_SIZE; i++) {
040            Double d = new Double(Math.random() * PR_SIZE);
041            int pos = d.intValue();
042            if(privateList[pos] == null) {
043              d = new Double(Math.random() * PR_SIZE);
044              int pos2 = d.intValue();
045              privateList[pos] = privateList[pos2] == null?
046                  concurrentList.addFirst(new Integer(i)):
047                  concurrentList.addItem(new Integer(i),privateList[pos2]);
048              Thread.sleep(pos2);
049            }
050            else {
051              concurrentList.removeItem(privateList[pos]);
052              privateList[pos] = null;
053            }
054            Thread.sleep(pos);
055          }
056        }
057        catch(Exception e) {
058          System.out.println("\n erroooorrr["+name+"]: "+e);
059          e.printStackTrace();
060        }
061        System.out.println("\nterminated ["+name+"]");
062      }
063        
064      public static void main(String args[]) {
065        try {
066          concurrentList = new ConcurrentList();
067    
068          TestThread h1 = new TestThread("thread1");
069          TestThread h2 = new TestThread("thread2");
070          Thread t1 = new Thread((Runnable)h1);
071          Thread t2 = new Thread((Runnable)h2);
072          t1.start();
073          t2.start();
074    
075          /*
076            uses conversion to array
077           */
078          while(t1.isAlive() && t2.isAlive()) {
079            Object[] a=concurrentList.toArray();
080            for(int index=0;index<a.length;index++) {
081              Integer integer=(Integer)a[index];
082              System.out.print(integer.toString());
083            }
084            System.out.println();
085            Thread.sleep(50);
086          }
087          t1.join();
088          t2.join();
089    
090          System.out.println("clearing list");
091          concurrentList.clear();
092          System.out.println("list cleared");
093    
094          h1 = new TestThread("thread3");
095          h2 = new TestThread("thread4");
096          t1 = new Thread((Runnable)h1);
097          t2 = new Thread((Runnable)h2);
098          t1.start();
099          t2.start();
100    
101          /*
102            uses iterator over elements
103           */
104          while(t1.isAlive() && t2.isAlive()) {
105            ConcurrentIterator i = concurrentList.listIterator();
106            try{
107              Integer element;
108              ConcurrentItem paramItem= new ConcurrentItem();;
109              while((element = (Integer)i.next()) != null) {
110                System.out.print(element.toString());
111              }
112            }
113            catch(NoSuchElementException e) {
114            }
115            System.out.println();
116            Thread.sleep(50);
117          }
118          t1.join();
119          t2.join();
120    
121          h1 = new TestThread("thread5");
122          h2 = new TestThread("thread6");
123          t1 = new Thread((Runnable)h1);
124          t2 = new Thread((Runnable)h2);
125          t1.start();
126          t2.start();
127    
128          /*
129            uses iterator over items
130           */
131          while(t1.isAlive() && t2.isAlive()) {
132            ConcurrentIterator i = concurrentList.listIterator();
133            ConcurrentItem paramItem= new ConcurrentItem();;
134            while(i.nextItem(paramItem) != null) {
135              Integer integer=(Integer)paramItem.getElement();
136              System.out.print(integer.toString());
137            }
138            System.out.println();
139            Thread.sleep(50);
140          }
141          t1.join();
142          t2.join();
143    
144        }
145        catch(Throwable e) {
146          e.printStackTrace();
147          System.out.println("e: " +e);
148        }
149      }
150    }