5

Sono ancora un principiante in Java quindi non ho imparato molto sui thread e sulla concorrenza. Tuttavia, mi piacerebbe essere in grado di utilizzare ScheduledThreadPoolExecutor come un timer a causa dei problemi che sto avendo con java.util.Timer e TimerTask. Sono estremamente interessato alla creazione di thread e so che imparerò su di loro in poche settimane. Tuttavia, se possibile, qualcuno potrebbe darmi un esempio di base su come convertire il mio attuale mini test utilizzando util.timer per usare ScheduledThreadPoolExecutor?conversione in ScheduledThreadPoolExecutor

Vorrei completare questo esempio al più presto, quindi non ho molto tempo per imparare i thread, non importa quanto mi piacerebbe. Detto questo per favore includi tutto ciò che ritieni sia importante che un principiante di Java dovrebbe sapere riguardo a ScheduledThreadPoolExecutor.

programma Esempio

ho fatto un piccolo esempio veloce per rappresentare il problema che sto avendo in un programma più ampio. Ciò che questo programma dovrebbe fare è consentire all'utente di premere un pulsante per avviare un contatore. L'utente deve quindi essere in grado di arrestare e riavviare il contatore ogni volta che lo desidera. Nel programma più grande è fondamentale che questo contatore resti uguale, quindi ho utilizzato il metodo scheduleAtFixRate() . È anche importante che il ritardo iniziale sia sempre lo stesso (in questo caso 0). Il problema (come sono sicuro che vedrete) è che una volta che il timer è stato cancellato non può essere riavviato, cosa che spero che ScheduledThreadPoolExecutor risolva.

codice

:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.TimerTask; 
import java.util.Timer; 

public class Tester extends JFrame { 
    JButton push = new JButton("Push"); 
    static JTextArea textOut = new JTextArea(); 
    Timer timer = new Timer(); 
    boolean pushed = false; 
    static int i = 1; 

    public Tester() { 
     super(); 
     add(push, BorderLayout.NORTH); 
     add(textOut); 
     push.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (!pushed) { 
        timer.scheduleAtFixedRate(new Task(), 0, 1000); 
        pushed = true; 
       } else { 
        timer.cancel(); 
        pushed = false; 
       } 
      } 
     }); 
    } 

    static class Task extends TimerTask { 
     public void run() { 
      textOut.setText("" + i++); 
     } 
    } 

    public static void main(String[] args) { 
     Tester a = new Tester(); 
     a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     a.pack(); 
     a.setVisible(true); 
    } 
} 

Io uso questa classe molto per il test così ci possono essere codice extra (penso l'ho rimosso tutto).

+2

mi sento come se stessi chiedendo SO di scrivere codice per voi ... sotto una veste appena velato di voler imparare le discussioni, " Vorrei completare questo esempio al più presto, quindi non ho molto tempo per imparare i thread, non importa quanto mi piacerebbe. " –

+0

Solitamente un esempio di apprendimento non contiene espressioni come "è vitale questo" e allo stesso modo. – SJuan76

+0

Spero che nessuno lo stia pensando. Sono appassionato di programmazione e sto studiando all'università.Se avessi voluto che le persone scrivessero il codice del mio programma avrei inserito il codice reale nell'esempio piuttosto che un esempio di test rapido che ho creato. –

risposta

23

Sostituire

Timer timer = new Timer(); 

con

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 

e

class Task extends TimerTask 

con

class Task implements Runnable 

e

timer.scheduleAtFixedRate(new Task(), 0, 1000); 

con

service.scheduleAtFixedRate(new Task(), 0, 1000, TimeUnit.MILLISECONDS); 

BTW Non si dovrebbe essere il tentativo di aggiornare l'interfaccia grafica su un altro thread. Invece si deve aggiungere un'attività al thread GUI swing a svolgere il compito

SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      textOut.setText("" + i++); 
     } 
    }); 
+4

+1 per aver menzionato il thread della GUI. – mrab

+0

Tuttavia, questo continua ad aggiungere thread morti. Ricevo 'pool - ## - thread-1' e non si puliscono mai. Mi sto perdendo qualcosa? – kmort

+0

@kmort Suppongo che non stai facendo un shutdown() quando hai finito. –

Problemi correlati