5

Hala Java'da yeni başlayan biriyim, bu yüzden iş parçacıkları ve eşzamanlılık hakkında çok şey öğrenmedim. Ancak, java.util.Timer ve TimerTask ile yaşadığım sorunlar nedeniyle ScheduledThreadPoolExecutor'ı bir zamanlayıcı olarak kullanmak istiyorum. Konuların oluşturulmasıyla son derece ilgileniyorum ve birkaç hafta içinde onları öğreneceğimi biliyorum. Ancak, mümkünse, birisi benim mevcut mini sınama programımı kullanarak util.timer kullanarak ScheduledThreadPoolExecutor kullanarak nasıl basit bir örnek verebilir?10 ScheduledThreadPoolExecutor'a dönüştürme

Bu örnekte ASAP'yi tamamlamak istiyorum. Bu yüzden, iş parçacıkları hakkında bilgi edinmek için fazla zamanım yok - ne kadar istesem de. Bunu söyledikten sonra, bir java acemisinin ScheduledThreadPoolExecutor ile ilgili bilmesi gereken önemli olduğunu düşündüğünüz her şeyi dahil edin.

Ben daha büyük bir programda yaşıyorum sorunu temsil edecek bir hızlı küçük bir örnek yaptık

Örnek programı. Bu programın yapması gereken, kullanıcının bir sayaç başlatmak için bir düğmeye basmasına izin vermektir. Kullanıcı daha sonra istediği zaman sayacı durdurabilir ve yeniden başlatabilir. Daha büyük programda bu sayacın eşit kalması hayati önem taşır, bu yüzden scheduleAtFixRate() yöntemini kullanmıştım. Başlangıç ​​gecikmesinin her zaman aynı olması önemlidir (bu durumda 0). Sorun (göreceğinizden eminim), zamanlayıcı iptal edildikten sonra yeniden başlatılamaz - ScheduledThreadPoolExecutor'ın çözeceğini umduğum bir şey.

kodu: (Ben bütün kaldırmasıyla düşünüyorum) fazladan kod olabilir böylece

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

ben test için bu sınıf çok kullanırlar.

+2

Hissettiğim görevi gerçekleştirmek için Salıncak GUI Konuya bir görev eklemek zorunda Bu örnekte ASAP'yi tamamlamak istiyorum. Bu yüzden ne kadar istesem de, iş parçacıkları hakkında bilgi edinmek için fazla zamanım yok. ” –

+0

Genellikle bir öğrenme örneği, "bu çok önemlidir" ve benzer şekilde ifade içermez. – SJuan76

+0

Umarım kimse bunu düşünmez. Programlama konusunda tutkuluyum ve üniversitede okuyorum.İnsanları programımı kodlamak istemiş olsaydım, gerçek kodu örnekte yerine koyduğum bir Hızlı Test örneğinin yerine koyardım. –

cevap

23

ile

Timer timer = new Timer(); 

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 

ve

class Task extends TimerTask 

ile değiştirin

class Task implements Runnable 

ve

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

BTW Başka parçacığı üzerinde GUI güncellemeye çalışırken olmamalıdır

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

ile. Bunun yerine, "sen konuları öğrenmek isteyen bir ince örtülü kisvesi altında ... sizin için kod yazmak için SO soruyorsun gibi

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

+1. – mrab

+0

Bunu yapmak, ölü iş parçacıkları eklemeye devam ediyor. Havuz alıyorum - ## - thread-1' ve asla temizlenmezler. Bir şey mi eksik? – kmort

+0

@kmort Bitirdiğinizde bir kapatma() yapmadığınızı varsayıyorum. –