[英]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.