home *** CD-ROM | disk | FTP | other *** search
/ Datatid 1999 #6 / Datatid_1999-06.iso / internet / Tango352Promo / Tango / data.z / ThreadManager.class (.txt) < prev    next >
Encoding:
Java Class File  |  1999-02-03  |  4.3 KB  |  166 lines

  1. package com.everyware.tango.jas;
  2.  
  3. import java.net.Socket;
  4. import java.util.Enumeration;
  5. import java.util.Vector;
  6.  
  7. public class ThreadManager extends Thread implements ResourceManager, Timeable {
  8.    private JAS jas;
  9.    private ThreadGroup threadGroup = new ThreadGroup("JAS resources");
  10.    private Vector resources = new Vector();
  11.    private Vector freeThreads = new Vector();
  12.    private Vector pendingRequests = new Vector();
  13.  
  14.    public ThreadManager(JAS var1) {
  15.       this.jas = var1;
  16.       if (var1.isTracing) {
  17.          var1.traceM.trace("TM: initializing...");
  18.       }
  19.  
  20.       for(int var2 = 0; var2 < var1.getMaxNumThreads(); ++var2) {
  21.          MessageHandler var3 = new MessageHandler(var1, this);
  22.          Thread var4 = new Thread(this.threadGroup, var3);
  23.          this.resources.addElement(new Resource(var4, var3));
  24.          if (var1.isTracing) {
  25.             var1.traceM.trace("TM: added another resource...");
  26.          }
  27.       }
  28.  
  29.       if (var1.isTracing) {
  30.          var1.traceM.trace("TM: all set up.");
  31.       }
  32.  
  33.    }
  34.  
  35.    public boolean hasFreeResources() {
  36.       return !this.freeThreads.isEmpty();
  37.    }
  38.  
  39.    public synchronized void newRequest(Socket var1) {
  40.       if (this.jas.isTracing) {
  41.          this.jas.traceM.trace("TM: new request: " + var1);
  42.       }
  43.  
  44.       this.pendingRequests.addElement(var1);
  45.    }
  46.  
  47.    private synchronized Socket getNextPendingRequest() {
  48.       Socket var1 = (Socket)this.pendingRequests.firstElement();
  49.       this.pendingRequests.removeElement(var1);
  50.       return var1;
  51.    }
  52.  
  53.    public synchronized void requestHandled(Object var1) {
  54.       Thread var2 = (Thread)var1;
  55.       this.jas.getTimer().deregister(var2);
  56.       this.freeThreads.addElement(var2);
  57.       if (this.jas.isTracing) {
  58.          this.jas.traceM.trace("TM: Added thread to the free list");
  59.       }
  60.  
  61.    }
  62.  
  63.    public void eventElapsed(Object var1) {
  64.       Thread var2 = (Thread)var1;
  65.       if (this.jas.isTracing) {
  66.          this.jas.traceM.trace("TM: Received notification of errant event!");
  67.       }
  68.  
  69.       Resource var3 = null;
  70.       Enumeration var4 = this.resources.elements();
  71.  
  72.       while(var4.hasMoreElements()) {
  73.          Resource var5 = (Resource)var4.nextElement();
  74.          if (var5.thread.equals(var2)) {
  75.             var3 = var5;
  76.             break;
  77.          }
  78.       }
  79.  
  80.       if (var3 == null) {
  81.          if (this.jas.isTracing) {
  82.             this.jas.traceM.trace("TM: Could not locate resource of elapsed event!");
  83.          }
  84.  
  85.       } else {
  86.          var3.thread.stop();
  87.          var3.thread = null;
  88.          var3.messageHandler = null;
  89.          if (this.jas.isTracing) {
  90.             this.jas.traceM.trace("TM: Create new thread");
  91.          }
  92.  
  93.          var3.messageHandler = new MessageHandler(this.jas, this);
  94.          var3.thread = new Thread(this.threadGroup, var3.messageHandler);
  95.          var3.thread.start();
  96.          if (this.jas.isTracing) {
  97.             this.jas.traceM.trace("TM: Adding new thread to free list");
  98.          }
  99.  
  100.          this.freeThreads.addElement(var3.thread);
  101.       }
  102.    }
  103.  
  104.    private synchronized void assignFreeResource(Socket var1) {
  105.       if (this.jas.isTracing) {
  106.          this.jas.traceM.trace("TM: Looking for a free resource to assign a request");
  107.       }
  108.  
  109.       Thread var2 = (Thread)this.freeThreads.firstElement();
  110.       this.freeThreads.removeElement(var2);
  111.       Enumeration var3 = this.resources.elements();
  112.  
  113.       while(var3.hasMoreElements()) {
  114.          Resource var4 = (Resource)var3.nextElement();
  115.          if (var4.thread.equals(var2)) {
  116.             if (this.jas.getActionTimeout() > 0) {
  117.                try {
  118.                   this.jas.getTimer().register(this, var4.thread, this.jas.getActionTimeout());
  119.                } catch (Exception var6) {
  120.                   if (this.jas.isTracing) {
  121.                      this.jas.traceM.trace("TM: Could not register request with TR: " + var6);
  122.                   }
  123.  
  124.                   this.freeThreads.addElement(var2);
  125.                   return;
  126.                }
  127.  
  128.                if (this.jas.isTracing) {
  129.                   this.jas.traceM.trace("TM: Registered request with TMR");
  130.                }
  131.             }
  132.  
  133.             var4.messageHandler.setSocket(var1);
  134.             var4.thread.resume();
  135.             return;
  136.          }
  137.       }
  138.  
  139.       if (this.jas.isTracing) {
  140.          this.jas.traceM.trace("TM: Should have located a message handler!");
  141.       }
  142.  
  143.    }
  144.  
  145.    public void run() {
  146.       Enumeration var1 = this.resources.elements();
  147.  
  148.       while(var1.hasMoreElements()) {
  149.          Thread var2 = ((Resource)var1.nextElement()).thread;
  150.          var2.start();
  151.          this.freeThreads.addElement(var2);
  152.       }
  153.  
  154.       while(true) {
  155.          while(this.pendingRequests.isEmpty() || this.freeThreads.isEmpty()) {
  156.             try {
  157.                Thread.sleep(5L);
  158.             } catch (InterruptedException var3) {
  159.             }
  160.          }
  161.  
  162.          this.assignFreeResource(this.getNextPendingRequest());
  163.       }
  164.    }
  165. }
  166.