2011-07-02 44 views
0

就我的理解而言,一個實現runnable的類似乎只能在其run方法中執行一個set任務。如何創建一個新線程,然後從這一個附加線程運行不同的方法,而無需爲每個設置的任務創建一個新的可運行類。在java中的一個可運行線程中調用不同的方法

+0

我不知道我理解你的問題的順序,但對於如何改變人們的行爲最普遍的回答是改變的狀態該對象並具有使用基於狀態改變行爲的控制結構(如if和else)的代碼。你可能想澄清你的問題。很大。 –

+0

@Hov認爲自己在我的迴應中喊出來。 – bmargulies

+0

@bmar:所以考慮,謝謝,1+ :) –

回答

2

您的Runnable類可以調用它喜歡的任何邏輯。你想運行的邏輯必須在某個類中,可以是Runnable類的不同方法,或者可以在許多其他類中使用。

您打算如何告訴可運行的操作?

你可以這樣做:

MyRunnable implements Runnable { 
    private String m_whatToDo; 

    public MyRunnable(String whatToDo) { 
      m_whatToDo = whatToDo; 
    } 


    public void Runnable run() { 
      if ("x".equals(m_whatToDo) { 
       // code to do X 
      } else if ("y".equals(m_whatToDo) { 
       // code to do Y 
      } else { 
       // some error handling 
      } 
    } 
} 

或者像SRIKANTH說,你可以溝通通過其他方式,如線程名稱的意圖。

但是,在創建可運行類時沒有看到太多開銷。只要給一個類添加一個public void run()肯定不是什麼大不了的事情?

+0

現在似乎很明顯,謝謝。 – Titus

-1

在run()方法中檢查線程名稱並調用相應的方法。

public class SampleThread implements Runnable{ 
/** 
* @param args 
*/ 
Thread t=null; 

public SampleThread(String threadName) 
{ 
    t=new Thread(this,threadName); 
    t.start(); 

} 
@Override 
public void run() { 
     if(t.getName().equals("one")) 
     { 
      One(); 
     } 
     else if(t.getName().equals("two")) 
     { 
      Two(); 
     } 
} 
public void One() 
{ 
    System.out.println(" ---- One ---- "); 
} 
public void Two() 
{ 
    System.out.println(" ---- Two ---- "); 
} 

public static void main(String[] args) { 
    SampleThread t1=new SampleThread("one"); 
    SampleThread t2=new SampleThread("two"); 

} 

}

+2

在我看來,使用線程名稱是很差的模塊化。 – bmargulies

+0

@bmargulies然後我們可以通過其他方法區分run()中的哪個線程,並調用其中的不同方法。 –

+0

請參閱討論將字段添加到Thread的子類的其他答案。哎呀,它可能是一個帶有構造函數的匿名類。 – bmargulies

2

類應該執行一個任務,並且也發揮得很好,如果你在一個可運行添加多個操作,那麼你違反了這個原則。您應該爲每個可運行任務創建一個Runnable的新實現。

爲了簡化您的api,您可能希望創建一個MyRunnableFactory方法,該方法根據一個或多個構建條件構造一個可運行的類。這將防止用戶不得不記住爲每個任務創建哪個類。

3
  1. 製作自己的主題(MyThread extends Thread
  2. 的子類添加私有成員來控制行爲。
  3. 添加bean模式get/set方法來控制私有成員,或使用流暢的API。
  4. run()方法中閱讀此屬性。
MyThread t = new MyThread(); 
t.setTypeOfSparrow("African"); 
t.setFavoriteColor("Yellow"); 
t.start(); 
+0

突然點擊這個答案,謝謝。 – Titus

+1

實現Runnable會更好。它給出了更多的自由,以便代碼將如何執行(例如,您可以使用Executor),因爲它沒有耦合到Thread類。 –

0

你的問題不是很清楚。我的猜測是你想在其他線程中運行不同的方法,但是你不想浪費時間爲每種方法重新啓動一個新的線程。在這種情況下,你需要一個線程ExecutorService。您可以按順序將一些Runnables提交給在呼叫之間保持活動的線程。

或者更簡單地說,如果你已經知道在你的方法被稱爲

(new Thread() { 
    @Override public void run() { 
     method1(); 
     method2(); 
     ... 
    } 
}).start(); 
相關問題