Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    19

    [JAVA] Esercizio gestione Threads

    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! )

    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

  2. #2
    ti consiglio di leggere
    http://forum.html.it/forum/showthrea...hreadid=588640

    prima si scrivere sul forum in specialmodo per quanto riguarda i titoli(questo lo modifico io)
    Vascello fantasma dei mentecatti nonchè baronetto della scara corona alcolica, piccolo spuccello di pezza dislessico e ubriaco- Colui che ha modificato l'orribile scritta - Gran Evacuatore Mentecatto - Tristo Mietitore Mentecatto chi usa uTonter danneggia anche te

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    19
    Mi spiace xegallo, ma non è stato intenzionale....non avevo mai letto
    le regole del forum...ho modificato il titolo
    BYE

  4. #4
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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,


  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    19
    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

    //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!!!!!!!!!!!!!!!!!!!!!!!!!!

  6. #6
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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.



  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    19
    Me lo puo fare un esempio con una bozza di codice per la JList?

  8. #8
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    Usa una JComboBox threadList per tenere la lista dei thread creati; nel frame principale puoi quindi aggiungere:

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

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

    Codice PHP:
    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]


  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2004
    Messaggi
    19
    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!!");
    }

    }

  10. #10
    Utente di HTML.it L'avatar di anx721
    Registrato dal
    Apr 2003
    Messaggi
    2,352
    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:

    Codice PHP:
    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 goOntrue;
        private 
    boolean sleep false;
        
        public 
    MyThread(String messageJTextArea 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(450450);
            
    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(
    == null
                    return; 
                    
    Thread selectedThread = (Thread)o
                    try{
                        
    selectedThread.start();
                    }
                    catch(
    Exception exx){
                        
    String s selectedThread " cannot be started: ";
                        
    messagesArea.append(exx "\n");
                    }
                    
    lastActionLabel.setText("Started " selectedThread);
                }
            };
            
            
    interruptAction = new AbstractAction("interrupt"){
                public 
    void actionPerformed(ActionEvent e){
                    
    Object o threadList.getSelectedItem();
                    if(
    == 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(
    == 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(131010));
            
    statusBar.add(currentThreadLabel);
            
    statusBar.add(threadList);
            
    statusBar.add(lastActionLabel);
            
    Border border BorderFactory.createEmptyBorder(5555);
            
    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(
    == null){
                
    currentThreadLabel.setText("No Thread Selected");
                return;
            }
            
    String s "Selected ";
            
    threadList.getSelectedItem().toString();
            
    currentThreadLabel.setText(s);
        }
    }


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


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.