PDA

Visualizza la versione completa : [Java] Thread (era: Chi sa risolvere questo esercizio?)


ralex76
24-02-2004, 14:13
Ciao a tutti,
in quanto neofita in JAVA ho difficoltà a risolvere alcuni
esercizi che di volta in volta mi propongono al corso che sto seguendo.
Ci sarebbe qualcuno in grado di risolvere questo?(Ci spero...non lo so impostare! :confused: )

ESERCIZIO :
Costruire un’interfaccia grafica per il monitoring e la gestione di Thread
In particolare, dare all’utente la possibilità di monitorare lo stato del thread e di cambiarlo (es. sospendere un thread, riattivarlo, ucciderlo)
Supponete di disporre di 5 thread che vengono lanciati all’avvio
Suggerimenti :
Fate uso della classe JList per gestire visivamente i Threads
Utilizzate i JButton e le ComboBox per operare sui Threads
Implementate a piacere il task dei threads (Es. create una classe MioThread che interagisca con il disco per scrivere o leggere qualcosa periodicamente). Quindi create 5 istanze della classe appena creata.

Spero che qualcuno ci riesca.
Grazie,
Ale

xegallo
24-02-2004, 14:16
ti consiglio di leggere
http://forum.html.it/forum/showthread.php?s=&threadid=588640

prima si scrivere sul forum in specialmodo per quanto riguarda i titoli(questo lo modifico io)

ralex76
24-02-2004, 14:25
Mi spiace xegallo, ma non è stato intenzionale....non avevo mai letto
le regole del forum...ho modificato il titolo;)
BYE

anx721
24-02-2004, 14:51
Bhè, l'esercizio già ti indica come impostare il tutto: dichiare una classe che estende Thread, e implementa il metodo run() opportunamente (ad esempio facendo leggere/oscrivere un file come ti viene suggerito). Quindi crei 5 istanze di questa classe e fai partire i thread. Mantieni un riferimento ad ogni thread in un array che poi utilizzrai per costruire la JList.

Nell'interfaccia grafica quindi avrai la JList i cui valori sono 5 identificatori per i 5 thread, e una serie di boottoni o altri elementi, uno per ogni tipo di azione che puoi poter eseguire su un thread. Qundo l'utente seleziona dalla JList un certo thread,tutte le azioni avvviate facendo click sui pulsanti sranno dirette verso quel thread selezionato. Puo anche aggiungere una JTextArea su cui stampare messaggi relativi all'azione effettuata,

inizia a buttare giu qlcosa, poi se hai problemi chiedi,

:ciauz:

ralex76
28-02-2004, 16:52
Ragazzi non ha ancora risolto quell'esercizio...
Ho buttato qualche idea.....ma chi sa risolverlo?
Ecco quello che ho fatto finora:

Ho abbozzato la classe di gestione(quella principale), mi manca la classe che implementa l'interfaccia grafica...ragà aiutatemi :confused:

//CLASSE PRINCIPALE
class FinestraGestione implements ActionListener{
/*tutto ciò che serve a creare l'interfaccia grafica*/
private JButton btnAvvia = new JButton("Avvia thread");
private Vector thread = new Vector();

//metodo che gestisce il click dei bottoni
public void actionPerformed(ActionEvent e){
String btnPremuto = e.getActionCommand();
if(btnPremuto.equals("Avvia thread");
MioThread mt = new MioThread();
Thread t = new Thread(mt);
t.start();
thread.addElement(t);
}
}
}
Inoltre nella classe che segue come metto le varie operazioni di gestione thread?Come sospendere un thread, riattivarlo, ucciderlo..ecc..

class MioThread extends JFrame implements Runnable{
/* istruzioni */
}

AIUTO!!!!!!!!!!!!!!!!!!!!!!!!!!

anx721
28-02-2004, 17:56
Per sapere come implementare le operazioni sui thread dai uno sguardo alle API di java relative a questa classe dove puoi leggere l'elenco dei metodi che offre.

La classe MioThread non deve estendere JFrame, o almeno non serve. Ad estendere JFrame deve essere la classe che costituirà la finestra principale dell'aplicazione.

ogni volta che crei un nuovo Thread, puoi aggiungere ad una JList un identificatore del thread stesso (ad esempio la stringa "Thread " + un numero intero progessivo). Attraverso la JLIst puoi selezionare cosi uno specifico thread verso cui andranno indirizzati i comandi.


:ciauz:

ralex76
28-02-2004, 18:27
Me lo puo fare un esempio con una bozza di codice per la JList?

anx721
28-02-2004, 19:02
Usa una JComboBox threadList per tenere la lista dei thread creati; nel frame principale puoi quindi aggiungere:



JComboBox threadList = new JCombobox();
threadList.objects.addActionListener(this);
threadList.setEditable(false);



Nel metodo actionPerfomed, quando è creato un nuovo thread, aggiungi alla lista il thread:



threadList.addItem(thread);
threadList.setSelectedItem(thread);


Per visualizzare i nomi dei thread, nella tua classe MioThread implementa un metodo

pubic String toString()

che ritorna il nome del thread.

Quando gestisci la pressione di un pulsante che ad esempio deve interrompere un tread, ti ricavi dalla JComboBox il thread correntemente selezionato ed esegui l'azione, esempio:

[PHP]
if(source == interruptButton){
Object o = threadList.getSelectedItem();
if(o == null)
return;
Thread selectedThread = (Thread)o;
selectedThread.interrupt();
}
[PHP]

:ciauz:

ralex76
09-03-2004, 01:07
Ciao a tutti,
ancora non sono riuscito a completare questo esercizio.
Ho creato l'interafccia grafica, ma ho difficoltà a gestire gli
eventi....In sostanza dovrei cercare di collegare la pressione di uno dei tre bottoni(start, stop, sleep) al thread selezionato in quell'istante. Analoga cosa si deve fare se anzichè agire sui bottoni agisco dalla combobox.(Deve funzionare come una generica applicazione, tipo word dove posso lanciare un operazione sia tramite bottoni che tramite menu a tendina) Per ora ho implementato una classe Thread banale, perchè quello che m'interessa è ottenere la possibilità di eseguire i thread in paralello e che siano indipendenti l'uno dall'altro.
Vi posto il codice che ho fatto e spero che qualcuno mi abbia capito e riesca a completare il mio codice.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;

public class ParteGrafica {

public static void main(String[] args) {

JFrame frame = new JFrame ("Esercizio sui Threads");

Container c = frame.getContentPane();
MioPanel pannello = new MioPanel();
c.add(pannello);
frame.addWindowListener( new Terminator() );
frame.pack();
frame.show();

}

}

class MioPanel extends JPanel implements ListSelectionListener, ActionListener {

JList jlist; JTextField txtJlist;
JTextField txt;
JComboBox lista;
public MioPanel() {

super();

JButton b1 = new JButton("START");
JButton b2 = new JButton("SLEEP");
JButton b3 = new JButton("STOP");
txt = new JTextField(15);
txt.setEditable(false);
txtJlist = new JTextField(15);
txtJlist.setEditable(false);
String voci[] = {"Thread1", "Thread2", "Thread3", "Thread4", "Thread5"};
jlist = new JList(voci);
JScrollPane pane = new JScrollPane(jlist);
jlist.setVisibleRowCount(3);

jlist.addListSelectionListener(this);

lista = new JComboBox();
lista.setEditable(true);
lista.addItem("START");
lista.addItem("SLEEP");
lista.addItem("STOP");
//b1.addActionListener(this);
//b2.addActionListener(this);
//b3.addActionListener(this);
lista.addActionListener(this);

setLayout(new GridLayout(4,1));
add(pane);
add(txtJlist);
add(b1);
add(b2);
add(b3);
add(txt);
add(lista);
//add(jlist);

}
public void valueChanged(ListSelectionEvent e) {
String scelta = (String) jlist.getSelectedValue();
txtJlist.setText("Scelta corrente: " + scelta);

}

public void actionPerformed (ActionEvent ev)
{
String s = (String) lista.getSelectedItem();
txt.setText("Scelta: " + s);
}


}
//questa classe fa si che chiudendo la finestra si esca dall'applicazione
class Terminator implements WindowListener {
public void windowClosed(WindowEvent e){}
public void windowClosing(WindowEvent e){
System.exit(0);
}
public void windowOpened(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
}

class MioThread extends Thread {

String message;

public MioThread(String message) {

this.message = message;

}

public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(message);
}
System.out.println(this.getName()+" ha finito!!");
}

}

anx721
09-03-2004, 19:55
Ho rifatto un po l'interfaccia grafica, la classe Mythread estende Thread e si limita a stampare il messaggio "Thread n" se il thread è l'n-esimo creato, quindi dorme un secondo e ritorna a stampare in un ciclo continuo.

I pulsanti disponibili sono:

new: crea un nuovo MyThread inserendolo nella JComboBox;
start: fa partire il Thread correntemete selezionato nella JComboBox;
interrupt: interrompe il Thread correntemente selezionato e lo elimina dalla JComboBox;
sleep: fa dormire il thread per 10 secondi ancizche per 1 secondo

Non so perchè ma non sono riuscito a terminare il thread invocandone il metodo interrupt; per ora ho ridefinito il metodo interrupt che setta una variabile booleana in modo da interrompere il cilo infinito.

Oltre ai pulsanti gli stessi comandi sono disponibili in un menu.

La classe principale che devi lanciare è ThreadExercise:

file ThreadExercise.java:



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;
import java.util.*;
import javax.swing.border.*;


class MyThread extends Thread{

private static int MyThreadId = 0;
private int id;
private String message;
private JTextArea area;
private boolean goOn= true;
private boolean sleep = false;

public MyThread(String message, JTextArea area){
id = MyThreadId;
MyThreadId++;
this.message = message;
this.area = area;
}

public void run(){
for(;goOn != false; ){
System.out.println("Thread " + id);
area.append("Thread " + id + "\n");
int pos = area.getDocument().getLength();
try{
area.setCaretPosition(pos);
}
catch(IllegalArgumentException exc){
}

try{
if(! sleep)
sleep(2000);
else{
sleep(10000);
sleep = false;
}
}
catch(InterruptedException ex){

}
}
}

public void interrupt(){
goOn = false;
}

public void sleep(){
sleep = true;
}

public String toString(){
return "Thread " + id;
}

}


class ThreadFrame extends JFrame implements ActionListener{

private JLabel currentThreadLabel;
private JLabel lastActionLabel;

private JButton newButton;
private JButton startButton;
private JButton interruptButton;
private JButton sleepButton;

private Action newAction;
private Action startAction;
private Action interruptAction;
private Action sleepAction;

private JComboBox threadList;

private JTextArea messagesArea;

private JToolBar toolbar;

private JPanel statusBar;

public ThreadFrame(){
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});

threadList = new JComboBox();
threadList.addActionListener(this);
threadList.setEditable(false);

createActions();
createButtons();
createToolbar();
createStatusBar();
createMenu();

messagesArea = new JTextArea();
messagesArea.setEditable(false);
messagesArea.setBackground(Color.BLACK);
messagesArea.setForeground(Color.WHITE);
getContentPane().add(new JScrollPane(messagesArea), "Center");

setTitle("Esercizio sui Thread");
setSize(450, 450);
getContentPane().add(toolbar, "North");

getContentPane().add(statusBar, "South");

show();
}

private void createActions(){
newAction = new AbstractAction("new"){
public void actionPerformed(ActionEvent e){
MyThread thread = new MyThread("", messagesArea);
threadList.addItem(thread);
threadList.setSelectedItem(thread);
lastActionLabel.setText("Created " + thread);
}
};

startAction = new AbstractAction("start"){
public void actionPerformed(ActionEvent e){
Object o = threadList.getSelectedItem();
if(o == null)
return;
Thread selectedThread = (Thread)o;
try{
selectedThread.start();
}
catch(Exception exx){
String s = selectedThread + " cannot be started: ";
messagesArea.append(s + exx + "\n");
}
lastActionLabel.setText("Started " + selectedThread);
}
};

interruptAction = new AbstractAction("interrupt"){
public void actionPerformed(ActionEvent e){
Object o = threadList.getSelectedItem();
if(o == null)
return;
threadList.removeItem(o);
Thread selectedThread = (Thread)o;
selectedThread.interrupt();
lastActionLabel.setText("Interrupted " + selectedThread);
}
};

sleepAction = new AbstractAction("sleep"){
public void actionPerformed(ActionEvent e){
Object o = threadList.getSelectedItem();
if(o == null)
return;
MyThread selectedThread = (MyThread)o;
selectedThread.sleep();
lastActionLabel.setText("Sleeping " + selectedThread);
}
};
}

private void createButtons(){
newButton = new JButton(newAction);
startButton = new JButton(startAction);
interruptButton = new JButton(interruptAction);
sleepButton = new JButton(sleepAction);
}

private void createToolbar(){
toolbar = new JToolBar();
toolbar.setRollover(true);
toolbar.add(newButton);
toolbar.add(startButton);
toolbar.add(interruptButton);
toolbar.add(sleepButton);
}

private void createStatusBar(){
currentThreadLabel = new JLabel("No Thread selected");
lastActionLabel = new JLabel("No action performed");;
statusBar = new JPanel(new GridLayout(1, 3, 10, 10));
statusBar.add(currentThreadLabel);
statusBar.add(threadList);
statusBar.add(lastActionLabel);
Border border = BorderFactory.createEmptyBorder(5, 5, 5, 5);
statusBar.setBorder(border);
}

private void createMenu(){
JMenuBar menubar = new JMenuBar();
JMenu actionsMenu = new JMenu("Actions");
menubar.add(actionsMenu);
actionsMenu.add(newAction);
actionsMenu.add(startAction);
actionsMenu.add(interruptAction);
actionsMenu.add(sleepAction);
setJMenuBar(menubar);
}

public void actionPerformed(ActionEvent e){
Object o = threadList.getSelectedItem();
if(o == null){
currentThreadLabel.setText("No Thread Selected");
return;
}
String s = "Selected ";
s = s + threadList.getSelectedItem().toString();
currentThreadLabel.setText(s);
}
}


class ThreadExercise{

public static void main(String[] args){
new ThreadFrame();
}
}

Loading