簡體   English   中英

你如何反復調用Java中的線程?

[英]How do you repeatedly call a Thread in Java?

我想要一個線程每500毫秒在后台執行一次。 為此,我擴展了一個Thread,實現了ActionListener並將我擴展的類放入Timer中。 Timer每500毫秒調用run()。 但是,當這個線程從Internet下載東西時,我的整個Swing GUI都會凍結。 我希望它在后台運行,而不會在等待IO完成時凍結GUI。 在我們等待500毫秒之前,我也是下載器完成下載。

調用gogogo()來初始化整個過程:

public final class Downloader extends Thread implements ActionListener
{
public static void gogogo()
{
    t= new Downloader();
    new Timer(500, (ActionListener) t).start();

}

public void run() 
{
    doStuff(); //the code that i want repeatedly called
}

public void actionPerformed(ActionEvent e) 
{
    run();
}
}

只需啟動一次線程,使其循環,並在每次迭代時執行Thread.sleep(500L) 每隔500毫秒啟動一個全新的線程可能更有意義。 如果可以避免,就沒有理由承擔相關費用。

而不是使用swing計時器嘗試使用java util計時器或ScheduledExecutorService。 擺動計時器共享預先存在的計時器線程,這可能導致凍結。

來自java教程的推薦:

通常,我們建議使用Swing計時器而不是通用計時器來處理與GUI相關的任務,因為Swing計時器都共享相同的預先存在的計時器線程,並且GUI相關任務會自動在事件派發線程上執行。 但是,如果您不打算從計時器觸摸GUI,或者需要執行冗長的處理,則可以使用通用計時器

如果你的GUI凍結,那么你的長度任務(doStuff)可能正在事件調度線程上運行。 雖然它占用了該線程,但其他操作無法使用它。

如果您嘗試重復運行任務,那么使用TimerTask類可能會更好

public class Downloader extends TimerTask {
    public void run() {
        doStuff();
    }
}

... elsewhere ...

Timer myTimer = new Timer();

public void gogogo() {
    myTimer.scheduleAtFixedRate(new Downloader(), 0, 500);
}

這有點不同,因為您的任務將被安排為每500毫秒運行而不是500毫秒延遲。 完成后,只需使用myTimer.cancel()來停止重復執行任務。

您需要在每個計時器操作上啟動線程。 調用線程的run()方法不會啟動線程。

public void actionPerformed(ActionEvent e) 
{
        //run();
Downloader t = new Downloader();
t.start();

}

可能最好為actionlistener使用匿名類。 請原諒我的java語法,但我還沒有驗證它...

  new Timer(500, 
      new ActionListener(){
            public void actionPerformed(ActionEvent e) 
            {
               //run();
               Downloader t = new Downloader();
               t.start();

            }
          }).start();

或者沒有計時器......

public static void gogogo()
{
        t= new Downloader();
        t.start();

}

public void run() 
{
    while(true){
        doStuff(); //the code that i want repeatedly called

        Thread.sleep(500);
    }
}

嗯,你很可能只需要降低線程優先級,所以它不會占用你所有的資源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM