2017-08-29 68 views
-1

我有一個名爲Flash的類,其中定義了Runnable如何從同一個Runnable正確創建另一個線程實例?

class Flash 
{ 
Runnable slow = new Runnable(){ 
    public void run(){ 
      //Do stuff here 
     } 
    } 
}; 
Thread slowThread = null; //Just declared a Thread variable 

//more stuff here 

} 

現在我有一個名爲blinkslow()方法創建使用slow可運行一個新的線程類對象:

void blinkSlow() 
{ 
    if(!threadRunning) //Boolean to make sure the thread is not running(works fine) 
    { 
     slowThread=null; 
     slowThread = new Thread(slow); 
     slowThread.start(); 
     threadRunning = true; 
    } 

} 

現在,當run()方法完成自己的工作,在其最後的陳述,它集這個布爾標誌threadRunning爲false,並退出。

然後當我第二次調用方法blinkslow()時,線程不運行。這是爲什麼發生? 我確信:

  • 線程已停止即再次調用blinkshow()方法之前完成其run()方法。
  • 我不想再次重新啓動同一個線程,因爲語句slowThread = new Thread(slow);每次調用時都會使用Runnable創建一個Thread類的新實例。

如何在第一次結束執行之後再次創建runnable的另一個實例?我上面所做的是第二次沒有工作,我不知道爲什麼。

+1

我們錯過了'threadRunning'的聲明。它是一個類實例嗎?我懷疑這個變量在執行後沒有被正確設置爲false。 – Xvolks

+0

交換'slowThread.start();'和'threadRunning = true;'調用'start()'創建一個「發生在...之前」的關係,對於變量的所有其他修改到此時爲止,您的線程可能會在'start '返回 – Ferrybig

+0

@Xvolks該標誌在同一個'Flash'類中聲明,就在這個Runnable之上。我的代碼直到現在都相當簡單,沒有太多的事情發生,我已經確認這個標誌設置並正常工作。 –

回答

0

我剛剛弄清楚我做錯了什麼,現在我感到很傻。我在run方法中有另一個標誌stop(一個布爾變量)。第一次運行後,我忘了解除它。

上面的代碼將正常運行沒有任何問題,除非你是我。

-2

當一個線程被完成時,他進入「死」狀態,並且它不能再被使用。 要使用run方法,您需要創建一個線程對象的新實例。

+0

所以'Runnable'變量'slow'必須每次都以某種方式聲明爲線程? –

+1

該代碼示例沒有顯示任何嘗試重新使用「Thread」對象,並且沒有理由說明Runnable對象無法重用。 –

相關問題