/* Sample code for Java Threads Lecture, based on ParticleApplet example in CPJ2e. RCS Info: $Id: ParticleAppletA.java,v 1.2 2001/04/25 13:33:30 bsl Exp $ */ import java.util.*; import java.applet.*; import java.awt.*; class Particle extends Thread { protected int x; protected int y; protected final Random rng = new Random(this.hashCode()); public Particle(int initialX, int initialY) { x = initialX; y = initialY; } public void run() { try { for(;;) { move(); sleep(100); // 100msec is arbitrary } } catch (InterruptedException e) { return; } } public synchronized void move() { x += (rng.nextInt() % 10); y += (rng.nextInt() % 10); } public void draw(Graphics g) { int lx, ly; synchronized (this) { lx = x; ly = y;} g.drawRect(lx, ly, 10, 10); } } class ParticleCanvas extends Canvas implements Runnable { private Particle[] particles = new Particle[0]; public ParticleCanvas(int size) { setSize(new Dimension(size, size)); } public void run() { try { for(;;) { repaint(); Thread.sleep(100); // 100msec is arbitrary } } catch (InterruptedException e) { return; } } // Called by the applet synchronized void setParticles(Particle[] ps) { if (ps == null) throw new IllegalArgumentException("Cannot set null"); particles = ps; } protected synchronized Particle[] getParticles() { return particles; } public void paint(Graphics g) { // override Canvas.paint Particle[] ps = getParticles(); for (int i = 0; i < ps.length; ++i) ps[i].draw(g); } } public class ParticleAppletA extends Applet { protected final ParticleCanvas canvas = new ParticleCanvas(400); protected Particle[] particles; // null when not running protected Thread canvasThread; public void init() { add(canvas); } public synchronized void start() { int n = 10; // just for demo if (particles == null) { // bypass if already started particles = new Particle[n]; for (int i = 0; i < n; ++i) { particles[i] = new Particle(200, 200); particles[i].setName("Particle Thread " + i); particles[i].start(); } canvas.setParticles(particles); canvasThread = new Thread(canvas); canvasThread.setName("Canvas Thread"); canvasThread.start(); } } public synchronized void stop() { if (particles != null) { // bypass if already stopped for (int i = 0; i < particles.length; ++i) particles[i].interrupt(); particles = null; canvasThread.interrupt(); canvasThread = null; } } }