FileDocCategorySizeDatePackage
RandomCharacterGenerator.javaAPI DocExample3025Sun Dec 07 10:45:00 GMT 2003javathreads.examples.ch12.example2

RandomCharacterGenerator

public class RandomCharacterGenerator extends Thread implements CharacterSource

Fields Summary
private char[]
chars
private int
curChar
private Random
random
private CharacterEventHandler
handler
private boolean
done
private Lock
lock
private Condition
cv
private String
host
private int
port
Constructors Summary
public RandomCharacterGenerator(String host, int port)


         
        handler = new CharacterEventHandler();
        this.host = host;
        this.port = port;
    
Methods Summary
public voidaddCharacterListener(CharacterListener cl)

        handler.addCharacterListener(cl);
    
public intgetPauseTime(int minTime, int maxTime)

        return (int) (minTime + ((maxTime-minTime)*random.nextDouble()));
    
public intgetPauseTime()

        return getPauseTime(2000, 5500);
    
private synchronized voidgetString()

        Socket sock = new Socket(host, port);
        DataInputStream reader = new DataInputStream(sock.getInputStream());
        reader.read();        // Welcome
        DataOutputStream writer = new DataOutputStream(sock.getOutputStream());
        byte b = TypeServerConstants.GET_STRING_REQUEST;
        writer.write(b);
        writer.flush();
        b = (byte) reader.readByte();
        if (b != TypeServerConstants.GET_STRING_RESPONSE) 
            throw new IllegalStateException("Bad recv state " + b);
        String s = reader.readUTF();
        chars = s.toCharArray();
        curChar = 0;
        sock.close();
    
public voidnextCharacter()

        try {
            if (chars == null)
                getString();
            handler.fireNewCharacter(this,
                                    (int) chars[curChar++]);
            if (curChar == chars.length)
                    getString();
        } catch (IOException ioe) {
            // Put up a dialog box to alert user of error
        }
    
public voidremoveCharacterListener(CharacterListener cl)

        handler.removeCharacterListener(cl);
    
public voidrun()

        try {
            lock.lock();
            while (true) {
                try {
                    if (done) {
                        cv.await();
                    } else {
                        nextCharacter();
                        cv.await(getPauseTime(), TimeUnit.MILLISECONDS);
                    }
                } catch (InterruptedException ie) {
                    return;
                }
            }
        } finally {
            lock.unlock();
        }
    
public voidsetDone(boolean b)

        try {
            lock.lock();
            done = b;

            if (!done) cv.signal();
        } finally {
            lock.unlock();
        }