home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / win95 / sieciowe / hotja32.lzh / hotjava / classsrc / browser / imagereader.java < prev    next >
Text File  |  1995-08-11  |  5KB  |  187 lines

  1. /*
  2.  * @(#)ImageReader.java    1.11 94/12/26 Jonathan Payne
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20. package browser;
  21.  
  22. import awt.*;
  23. import java.util.*;
  24. import java.io.*;
  25. import net.www.html.*;
  26.  
  27. class ImageFetcher implements Runnable {
  28.     ImageReader        master;
  29.     ImageHandle        h;
  30.  
  31.     ImageFetcher(ImageReader master, ImageHandle h) {
  32.     this.master = master;
  33.     this.h = h;
  34.     }
  35.  
  36.     public void run() {
  37.     try {
  38.         h.fetchImage();
  39.     } catch(ThreadDeath e) {
  40.         h.setImage("Image fetch cancelled, try again");
  41.     } catch(Exception e) {
  42.         System.out.println("Error " + e + " reading " + h);
  43.     }
  44.     master.imageFetcherCompletes(h, this);
  45.     }
  46. }
  47.  
  48. /**
  49.  * Class ImageReader is a thread which sits around waiting for
  50.  * requests to fetch images in behalf of ImageHandles.  It performs
  51.  * fetches in background threads, and allows up to
  52.  * <b>ImageReader.simultaneousFetcherLimit</b> requests at the same
  53.  * time.  ImageReader is created and managed by instances of WRWindow.
  54.  * @see WRWindow
  55.  * @version 1.11, 26 Dec 1994
  56.  * @author Jonathan Payne
  57.  */
  58.  
  59. public class ImageReader extends Thread {
  60.     static int    simultaneousFetcherLimit = 4;
  61.  
  62.     Vector handles = new Vector();
  63.     Hashtable allFetchers = new Hashtable(simultaneousFetcherLimit);
  64.     URL ThisURL;
  65.     int    fetcherCount = 0;
  66.     boolean paused = true;
  67.  
  68.     public ImageReader () {
  69.     setName("Background Image Reader");
  70.     setDaemon(true);
  71.     start();
  72.     }
  73.  
  74.     synchronized boolean emptyQueue() {
  75.     return (fetcherCount == 1 && handles.size() == 0);
  76.     }
  77.  
  78.     synchronized void waitForRequest() {
  79.     while (fetcherCount >= simultaneousFetcherLimit) {
  80.         wait(1000);
  81.     }
  82.     while (handles.size() == 0) {
  83.         wait(1000);
  84.     }
  85.     }
  86.  
  87.     private synchronized ImageHandle getNextRequest() {
  88.     ImageHandle h;
  89.  
  90.     if (handles.size() == 0) {
  91.         return null;
  92.     }
  93.     h = (ImageHandle) handles.elementAt(0);
  94.     handles.removeElementAt(0);
  95.     return h;
  96.     }
  97.  
  98.     synchronized void flushPending() {
  99.     handles.setSize(0);
  100.     }
  101.  
  102.     synchronized void stopFetches() {
  103.     for (Enumeration e = allFetchers.elements() ; e.hasMoreElements() ;) {
  104.         Thread th = (Thread)e.nextElement();
  105.         if (th.isAlive()) {
  106.         th.stop();
  107.         }
  108.     }
  109.     allFetchers = new Hashtable(simultaneousFetcherLimit);
  110.     }
  111.  
  112.     /*
  113.      * Fork a thread to fetch a single image.  If there are already
  114.      * some maximum number of image fetches outstanding, this
  115.      * routine blocks waiting for one of the others to complete.
  116.      */
  117.     private synchronized void forkImageFetcher(ImageHandle h) {
  118.     fetcherCount += 1;
  119.     ImageFetcher fetcher = new ImageFetcher(this, h);
  120.     Thread th = new Thread(fetcher, "ImageFetcher " + fetcherCount);
  121.     th.start();
  122.     allFetchers.put(fetcher, th);
  123.     }
  124.  
  125.     synchronized void imageFetcherCompletes(Observable o,
  126.                         ImageFetcher fetch) {
  127.     o.notifyObservers();
  128.  
  129.     allFetchers.remove(fetch);
  130.     if (fetcherCount-- == simultaneousFetcherLimit) {
  131.         notifyAll();
  132.     }
  133.     }
  134.  
  135.     /**
  136.      * Add an ImageHandle to the background image reader.  This
  137.      * causes the specified ImageHandle to have its image loaded by a
  138.      * background thread.
  139.      * @param h    the ImageHandle to load.
  140.      */
  141.     synchronized void add(ImageHandle h) {
  142.     handles.addElement(h);
  143.     notifyAll();
  144.     }
  145.  
  146.     /**
  147.      * Remove an ImageHandle from the image read queue. It won't
  148.      * cancel the request if it has already started.
  149.      */
  150.     synchronized void remove(ImageHandle h) {
  151.     handles.removeElement(h);
  152.     }
  153.  
  154.     synchronized int imagesPending() {
  155.     return handles.size() + fetcherCount;
  156.     }
  157.  
  158.  
  159.     public void run() {
  160.     try {
  161.         ImageHandle h;
  162.  
  163.         setPriority(Thread.MIN_PRIORITY+1);
  164.         while (true) {
  165.         waitForRequest();
  166.         
  167.         h = getNextRequest();
  168.  
  169.         if (h != null) {
  170.             try {
  171.             forkImageFetcher(h);
  172.             } catch(Exception e) {
  173. //            System.out.print("Error in image reader: ");
  174. //            e.printStackTrace();
  175.             }
  176.         }
  177.         }
  178.     } catch (ThreadDeath d) {
  179.         for (Enumeration e = handles.elements() ; e.hasMoreElements() ;) {
  180.         ImageHandle h = (ImageHandle)e.nextElement();
  181.         h.setImage("Image fetch cancelled, try again");
  182.         }
  183.         stopFetches();
  184.     }
  185.     }
  186. }
  187.