5

Wciąż jestem początkującym użytkownikiem Javy, więc nie nauczyłem się wiele o wątkach i współbieżności. Chciałbym jednak móc używać ScheduledThreadPoolExecutor jako czasomierza z powodu problemów, które mam z java.util.Timer i TimerTask. Jestem bardzo zainteresowany tworzeniem wątków i wiem, że będę się o nich uczyć za kilka tygodni. Jednak, jeśli to możliwe, ktoś mógłby mi dać podstawowy przykład, jak przekonwertować mój obecny program testowy mini używając util.timer do korzystania z ScheduledThreadPoolExecutor?Konwersja do programu ScheduledThreadPoolExecutor

Chciałbym uzupełnić ten przykład JAK NAJSZYBCIEJ, więc nie mam czasu na poznanie wątków - bez względu na to, jak bardzo bym chciał. Powiedziawszy to, proszę dołączyć wszystko, co uważasz za ważne, że początkujący java powinien znać w odniesieniu do ScheduledThreadPoolExecutor.

Przykładowy program

Zrobiłem szybki mały przykład do reprezentowania Problem występuje w większej programu. To, co ten program powinien zrobić, to pozwolić użytkownikowi na naciśnięcie przycisku, aby rozpocząć licznik. Użytkownik musi wtedy móc zatrzymać i ponownie uruchomić licznik, kiedy tylko chce. W większym programie ważne jest, aby ten licznik był równy, więc użyłem metody scheduleAtFixRate() . Ważne jest również, aby początkowe opóźnienie było zawsze takie samo (w tym przypadku 0). Problem (jestem pewien, że zobaczysz) jest taki, że gdy timer zostanie anulowany, nie można go uruchomić ponownie - coś, co mam nadzieję, że rozegra się ScheduledThreadPoolExecutor.

Kod:

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); 
    } 
} 

Używam tej klasy dużo do testów, więc nie może być dodatkowy kod (chyba usunąłem je wszystkie).

+2

czuję jak pytasz SO napisać kod dla Ciebie ... pod skrywaną przykrywką chcąc dowiedzieć się wątki " Chciałbym uzupełnić ten przykład JAK NAJSZYBCIEJ, więc nie mam czasu na poznanie nici - bez względu na to, jak bardzo bym chciał. " –

+0

Zwykle przykład uczenia się nie zawiera sformułowań takich jak "jest to istotne" i podobnie. – SJuan76

+0

Mam nadzieję, że nikt tak nie myśli. Jestem pasjonatem programowania i studiuję go na uniwersytecie.Gdybym chciał, aby ludzie zakodowali mój program, wstawiłbym ten kod w tym przykładzie, a nie w przykład Quick Test, który zrobiłem. –

Odpowiedz

23

wymienić

Timer timer = new Timer(); 

z

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 

i

class Task extends TimerTask 

z

class Task implements Runnable 

i

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

z

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

BTW Nie powinno być próbą zaktualizowania GUI w innym wątku. Zamiast tego trzeba dodać zadanie do Swing GUI wątek, aby wykonać zadanie

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

+1 za wzmiankę o wątku GUI. – mrab

+0

Mimo to dodajemy martwe wątki. Otrzymuję 'pool - ## - thread-1' i nigdy nie zostaną wyczyszczone. Czy czegoś brakuje? – kmort

+0

@kmort Zakładam, że nie robisz zamknięcia() po zakończeniu. –

Powiązane problemy