esercizio 5
Questo esercizio crea un vettore di oggetti PallaRunnable in thread separati e li anima nella finestra dell'applet. La classe palla utilizza il vettore come contenutore e rappresenta l'oggetto il cui movimento é autonomo cioé non comandato dall'applet stessa. Sono stati presi gli accorgimenti standard per evitare lo sfarfallio, disegnando in una graphics offscreen gli oggetti cerchio e cancellando sempre e solo la versione offscreen. Tale tecnica impedisce di notare le fasi di disegno e cancellazione che possino alternarsi prima dell'avvenuta visualizzazione.
Tramite il parametro num é possibile indicare il numero di cerchi da disegnare.
Le leggi fisiche che regolano il movimento sono le leggi del moto associate alla seconda equazione della dinamica in presenza di accelerazione dei gravità terrestre g=9.81 m/s2

package corsoDrZito.lez3.es5;

import java.applet.Applet;
import java.awt.*;
import java.util.Vector;
import java.util.Enumeration;

public class esercizio5 extends Applet implements Runnable
{
	public void init()
	{
		int num = 5;

		d = getSize();

		String param = getParameter("num");
		if (param!=null) num = Integer.parseInt(param);

		palle = new Vector(num);
		for(int i=0;i<num;i++)
			palle.addElement( new PallaRunnable(d) );

		im = createImage(d.width, d.height);
		myg = im.getGraphics();

		setBackground(new Color(48,64,96));

		t = new Thread(this);
		t.start();
	}

	public synchronized void update(Graphics g) { paint(g); }

	public synchronized void paint(Graphics g)
	{
		myg.clearRect(0, 0, d.width, d.height);

		for(Enumeration e = palle.elements(); e.hasMoreElements(); )
			((PallaRunnable)e.nextElement()).paint(myg);

		g.drawImage(im, 0, 0, this);
	}

	public void run()
	{
		Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
		do
		{
			repaint();
			try
			{
				Thread.currentThread();
				Thread.sleep(10L);
			}
			catch(InterruptedException ex) {}
		}
		while(true);
	}

	private Vector palle;

	private Image im;
	private Graphics myg;
	private Dimension d;
	private Thread t;
}

package corsoDrZito.lez3.es5;

import  corsoDrZito.lez3.es4.Palla;

import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.Color;

public class PallaRunnable extends Palla implements Runnable
{
	public PallaRunnable(Dimension d)
	{
		super(d);
		(new Thread(this)).start();
	}

	public void run()
	{
		Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
		do
		{
			muovi();
			try
			{
				Thread.currentThread();
				Thread.sleep(5L);
			}
			catch(InterruptedException ex) {}
		}
		while(true);
	}
}