2015-12-04 79 views
0

我有一個實現Runnable類似的類:創建線程每次的新實例,我想運行與否

private class myThread implements Runnable { 
    @overide 
    Public void run(){ 
    //refreshes a page 
    } 
} 

現在可以說,我有一個按鈕,我要運行的線程按下時所以在onclick我會有:

Thread myThread = new Thread(new myThread()); 
myThread.start(); 

現在我的問題是我應該做的應用程序運行時則的onClick我只做

創建該類每次的實例,我按一下按鈕,還是應該只是做一次
myThread.start(); 

如果這樣會導致任何問題,如果有人決定在線程有時間完成之前重複按下刷新按鈕? 每次創建新實例會有什麼優點和缺點?

我在Android中這樣做,所以我想知道這是如何影響應用程序正在做的事情。

回答

2

這裏沒有選擇。您只能爲Thread的每個實例調用start()一次;它會拋出一個IllegalThreadStateException如果您再次撥打start()對同一個Thread對象。爲每次點擊製作一個新實例。

但是,如果MyThread類不保留任何內部實例數據,則每次都不需要新的MyThread實例。你可以創建一個單一的MyThread對象,並在每次創建新Thread時重複使用它:

Thread myThread = new Thread(mMyThread); 

(其中mMyThread是存儲在成員字段,並將創建一次一個實例)。

在我看來,最乾淨的方法是繼承Thread代替實施Runnable

private class MyThread extends Thread { 
    @overide 
    Public void run(){ 
     //refreshes a page 
    } 
} 

然後,你可以這樣做:

new MyThread().start(); 

,並不必擔心是否不MyThread類具有實例數據,每個Thread實例都需要私有實例數據。 (這將有額外的好處,使名稱忠實於實際的對象類型。)

+0

嗯我明白了,但如果我檢查之前的線程是否完成之前我開始()線程再次onClick,會是以任何方式有益於不必每次創建新實例? –

+0

@Amroelaswar - 你**不能**再次啓動線程。系統不會讓你這樣做。正如我在編輯中指出的那樣,您可能每次都不需要一個'MyThread'的新實例,但是您每次都需要一個新的'Thread'對象。 (順便說一句,我將重命名類MyRunnable而不是MyThread,因爲它不是Thread類的子類。) –

+0

好的,謝謝你的接受答案,我知道但只是習慣了調用它的線程,幫助我把東西放在一起編碼;) –

相關問題