2016-11-25 60 views
0

我正在寫一個android應用程序。 在主線程中,可以定義方法然後調用方法,這有助於保持代碼清潔。在一個新線程中,如何定義方法以避免將所有代碼寫入「一個塊」?是否可以調用在主線程中定義的方法,或者可以以某種方式在新線程中定義它們? 所以要清楚,我想這樣做是:如何爲線程創建方法?

volatile Runnable feedToBuffer = new Runnable() 
     { 
      @Override 
      public synchronized void run() 
{ 
    if(boolean) 
    { 
    MethodA(); 
    } 
    else 
    { 
    MethodB(); 
    } 
} 

,而不是這樣的:

volatile Runnable feedToBuffer = new Runnable() 
      { 
       @Override 
       public synchronized void run() 
    { 
     if(boolean) 
     { 
     //Code that was in MethodA 
     } 
     else 
     { 
     //Code that was in MethodB 
     } 
    } 
} 

這可能嗎? 我意識到這個信息可能在那裏,但沒有找到它,所以非常感謝任何幫助。 :)

+1

是的,當然,這是可能的。 'run'方法只是一個普通的方法,它也可以調用其他方法。 – Thilo

+2

剛剛在run()...之後定義了這些方法''new Runnable(){/ *在這裏我可以創建每個我想要的方法* /}' – AxelH

+3

'synchronized'運行方法很奇怪。你爲什麼補充說? – Thilo

回答

1

這是完全可能的。線程只是一系列操作,如果涉及方法調用,它將在該序列中執行。沒關係。

線程與您的代碼結構無關。您開始的線程與您在應用程序啓動時的線程之間的主要區別在於入口點。當Android啓動主線程時,它會在許多點進入您的應用程序,這些活動可能是生命週期調用,如onCreate()或按鈕點擊偵聽器。當你創建一個新的線程時,你的輸入點是你可以調用任何你想要的方法的run方法。

還有一個區別在於主線程運行事件循環。基本上,它有一個必須處理的消息隊列。每次到達隊列時,它都會處理消息,然後返回到等待狀態。在這個意義上,主線程永遠不會結束。然而,當你的線程到達run方法的末尾時停止。當然,你可以自己爲你的線程實現一個類似的事件循環。

除此之外,線程的運行方式沒有根本的區別,您可以自由地從任何線程中調用方法。當然,多線程的規則就像避免阻塞主線程,同步等一樣,但在一個答案中覆蓋太多。

+0

所以基本上,我可以從main調用一個方法,只要我沒有嘗試做它之前,它已經有時間來定義或在相同的時間不同的線程正試圖使用​​它?這是很好的知道,我會去在這個案例中分別定義線程中的方法,因爲它看起來最安全,但會檢查到同步 - 似乎很重要。 :) – gnyrfta

+1

@gnyrfta如果他們不修改任何東西,你可以同時調用相同的方法。如果他們這樣做,那麼你需要意識到同步編寫正確的程序。我會把你引用到[Oracle的併發教程](https://docs.oracle。COM/JavaSE的/教程/本質/併發/ index.html的)。你真的需要閱讀它們,否則你可能會寫出不正確的代碼,這些代碼在大多數情況下都可以正常工作,但卻意外失敗。對於更先進的東西,我建議您閱讀Java Concurrency in Practice,它是一本非常有用的書。 – Malcolm

+0

謝謝!我會看看。 – gnyrfta