就我的理解而言,一個實現runnable的類似乎只能在其run方法中執行一個set任務。如何創建一個新線程,然後從這一個附加線程運行不同的方法,而無需爲每個設置的任務創建一個新的可運行類。在java中的一個可運行線程中調用不同的方法
回答
您的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()肯定不是什麼大不了的事情?
現在似乎很明顯,謝謝。 – Titus
在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");
}
}
在我看來,使用線程名稱是很差的模塊化。 – bmargulies
@bmargulies然後我們可以通過其他方法區分run()中的哪個線程,並調用其中的不同方法。 –
請參閱討論將字段添加到Thread的子類的其他答案。哎呀,它可能是一個帶有構造函數的匿名類。 – bmargulies
類應該執行一個任務,並且也發揮得很好,如果你在一個可運行添加多個操作,那麼你違反了這個原則。您應該爲每個可運行任務創建一個Runnable的新實現。
爲了簡化您的api,您可能希望創建一個MyRunnableFactory方法,該方法根據一個或多個構建條件構造一個可運行的類。這將防止用戶不得不記住爲每個任務創建哪個類。
- 製作自己的主題(
MyThread extends Thread
) - 的子類添加私有成員來控制行爲。
- 添加bean模式get/set方法來控制私有成員,或使用流暢的API。
- 在
run()
方法中閱讀此屬性。
MyThread t = new MyThread(); t.setTypeOfSparrow("African"); t.setFavoriteColor("Yellow"); t.start();
突然點擊這個答案,謝謝。 – Titus
實現Runnable會更好。它給出了更多的自由,以便代碼將如何執行(例如,您可以使用Executor),因爲它沒有耦合到Thread類。 –
你的問題不是很清楚。我的猜測是你想在其他線程中運行不同的方法,但是你不想浪費時間爲每種方法重新啓動一個新的線程。在這種情況下,你需要一個線程ExecutorService。您可以按順序將一些Runnables
提交給在呼叫之間保持活動的線程。
或者更簡單地說,如果你已經知道在你的方法被稱爲
(new Thread() {
@Override public void run() {
method1();
method2();
...
}
}).start();
- 1. 是否可以在Java RMI的同一線程中對兩個不同的方法執行遠程調用?
- 2. 的java:正在運行的線程方法在同一類
- 3. 一個類可以在Java中爲兩個不同的線程使用兩種運行方法嗎?
- 4. 如何同時在不同線程的對象中運行一個方法?
- 5. cocos2d調度方法是否在另一個線程中運行?
- 6. 如何調用與線程運行()不同的方法
- 7. 從ndk中的不同線程調用java方法
- 8. Java線程可運行/可調用
- 9. Java - 在現有的線程上運行一個可運行的?
- 10. 同步內部線程運行方法中使用的方法
- 11. 如何在不同的可運行線程中讀取不同的文件Java
- 12. Java:可以2個線程真正同時在一個對象上運行相同的非同步方法嗎?
- 13. 如何從UWP中的另一個正在運行的線程調用UI線程中的方法?
- 14. 從java中的另一個線程調用方法
- 15. 線程中調用睡眠方法的不同方法
- 16. 不同的線程在同一時間調用該方法
- 17. 我可以在java中的線程中運行線程嗎?
- 18. 線程中的不同類的運行方法
- 19. 中斷內的另一個線程的run方法,一個線程在Java中
- 20. 在Python中運行不同的線程
- 21. 如何從java中的另一個正在運行的線程訪問方法
- 22. 在Java中,如何運行differentes方法,每個線程中有一個?
- 23. 如何隨機調用一個方法在java中運行?
- 24. 在Java的不同線程中運行後臺進程
- 25. 如何在Android的另一個線程中運行方法?
- 26. 如何使用ruby線程在類中運行一個方法?
- 27. 在SpriteKit中,touchesBegan與SKScene更新方法在同一個線程中運行嗎?
- 28. Java:一個接一個線程的調用方法
- 29. 在行選擇(在p:dataTable中)調用不同的java方法?
- 30. 方法在單獨的線程中運行 - 如何調用線程
我不知道我理解你的問題的順序,但對於如何改變人們的行爲最普遍的回答是改變的狀態該對象並具有使用基於狀態改變行爲的控制結構(如if和else)的代碼。你可能想澄清你的問題。很大。 –
@Hov認爲自己在我的迴應中喊出來。 – bmargulies
@bmar:所以考慮,謝謝,1+ :) –