La Multiprogrammazione in Java
Passiamo ora alla multiprogrammazione
cioe' alla possibilita' di far partire dei processi che girano in parallelo
col processo che li ha fatti partire.Il tutto viene gestito attraverso
l'oggetto Thread.Il processo da eseguire va indicato nel metodo
run dello stesso oggetto, mentre i metodi start e
stop possono essere usati per far partire/stoppare il processo in parallelo.
Il processo si ferma anche perche' l'algoritmo indicato in run ha finito l'esecuzione. Il metodo stop e' stato deprecato e negli esempi che
seguono si fa fermare il Thread usando una tecnica diversa.
La multiprogrammazione con Thread in un applet
e' un'interessante caso di uso di oggetto del quale abbiamo bisogno
di ridefinire un metodo di una classe diversa dalla classe madre :in questo caso il metodo
run di Thread mentre la classe madre e' Applet.
Applet 1 : realizzazione di un'animazione senza
multiprogrammazione.
S
import javax.swing.*;
import java.awt.*;
public class Anim0 extends JApplet {
int x,y,r;
Display disegno;
public void init() {
disegno = new Display();
setContentPane(disegno);
x = 0; y=200; r=50;
while(true) {
for (x = r; x <= disegno.getSize().width ; x=x+1) {
disegno.repaint();
}
}
}
class Display extends JPanel{
public void paintComponent(Graphics g) {
g.setColor(Color.red);
g.fillOval(x,y,2*r,2*r);
}
}
}
Vedete qui l'applet in funzione.
Non si vede niente,perche' non abbiamo alcun controllo sul tempo.Quando
riusciamo a guardare l'applet, l'animazione e' gia' finita.
Applet 2 : realizzazione di un'animazione con la
multiprogrammazione.
S
import java.awt.*;
import javax.swing.*;
public class Anim1 extends JApplet implements Runnable {
Display disegno;
Thread animazione;
int x,y,r;
public void init() {
disegno = new Display();
setContentPane(disegno);
x = 0; y=200; r=50;
}
public void start() {
if (animazione == null) {
animazione = new Thread(this);
animazione.start();
}
}
public void stop() {
if (animazione != null) {
animazione = null;
}
}
public void run() {
while(true) {
for (x = r; x <= disegno.getSize().width ; x=x+1) {
disegno.repaint();
try { Thread.sleep(100);}
catch (InterruptedException e) { }
}
}
}
class Display extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(x,y,2*r,2*r);
}
}
}
Vedete qui l'applet in funzione.
-
Ora l'animazione e' perfettamente visibile e possiamo variare la velocita'
cambiando il tempo nella chiamata a sleep(). Cliccando su reload provochiamo la chiamata di start() dell'applet e quindi l'animazione riparte.
- L'animazione si ottiene incrementando la
variabile x che indica la posizione del cerchio e richiamando ogni volta
la
repaint.
Applet 3 :
come il precedente ma ora l'animazione e' realizzata con un Timer di swing .
S
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Anim2 extends JApplet implements ActionListener {
Display disegno;
Timer timer;
int x,y,r;
Image o;
Graphics og;
public void init() {
disegno = new Display();
setContentPane(disegno);
x = 0; y=200; r=50;
}
public void start() {
if (timer == null) {
timer = new Timer(100,this);
timer.start();
}
}
public void stop() {
if (timer != null) {
timer.stop();
}
}
public void actionPerformed(ActionEvent e) {
x = x + 1;
if(x>disegno.getSize().width)x = 0;
disegno.repaint();
}
class Display extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(x,y,2*r,2*r);
}
}
}
Vedete qui l'applet in funzione.
- L'oggetto Timer genera ogni 100 millisecondi un evento ActionEvent
- il metodo actionPerformed processa l'evento creando l'animazione
- i metodi start() e stop() dell'applet hanno funzione simile a quella
dell'applet precedente.Solo che adesso si tratta di far partire o stoppare
il timer.
Ultimo aggiornamento:
Thu, 24 Jan 2002 15:45:10 GMT