據說如果一個類實現了Runnabe接口,它可以變成一個線程,它的實例可以共享類中的同一個數據區。但是,Runnable接口中只有run()方法,那麼它是如何實現的呢?在JAVA多線程中共享相同的數據區域?
回答
@La凱特,分享發生在一個具體的類implements Runnable
。這樣的類將具有狀態,即,保存關於Runnable
實例的信息的字段。這些字段在使用完全相同的Runnable
實例的每個線程之間共享。這與錯誤的extends Thread
習語不同,每個線程都有其獨立的狀態。
因此,例如:
final Runnable runnable = new Runnable() {
final Object lock = new Object();
final ImportantInfo info = new ImportantInfo();
@Override
public void run() {
while (true) {
doABunchOfStuff();
synchronized (lock) {
info.load();
}
doABunchOfOtherStuff();
}
}
};
這Runnable
實例可以被髮送到一個以上的Thread
:
Thread footh = new Thread(runnable);
Thread barth = new Thread(runnable);
footh.start();
barth.start();
兩個線程使用完全相同的Runnable
,所以這意味着每個線程現在股狀態通過不可變的lock
對象和可變的info
對象。前者可以同步訪問,後者可以在線程之間傳遞更改。
事實上,Runnable接口只提供了一種將對象轉變爲線程的方法(它是一個接口),它不是共享變量的結構,這些對象可以使用「synchronized」修飾符或其他線程安全結構共享變量(你可以在oracle指南中找到它),但這取決於你。
訪問您的實例字段這並未」請在這裏解釋實例如何共享數據,正如OP所要求的。 –
但是,在Runnable接口中只有run()方法,那麼 如何實現呢?
這是通過在你的runnables中引入狀態然後傳遞這些狀態對象的相同實例來實現的。沒有狀態的可運行程序不共享數據。
下面不是一個正在運行或編譯的代碼,只是給你一個大概的想法 - 有兩個線程共享一個Student
對象。 private Student student;
將狀態引入您的可運行。
public class ExampleRunnable implements Runnable {
private Student student;
public void ExampleRunnable(Student student){
this.student=student;
}
@Override
public void run(){
.....do something with student here in synchronized way....
.....
}
以下是創建線程類,
public class MainClass {
public static void main(String[] args){
Student student = new Student();
Thread thread1 = new Thread(new ExampleRunnable(student));
Thread thread2 = new Thread(new ExampleRunnable(student));
/* So in above code, there are two different runnables and two different threads but both are using same Student object . This way you can share data among various runnables/threads. */
}
}
}
'ExampleRunnable#student'應該是'final',並且可以共享'Runnable'實例本身。 –
- 1. 線程池,共享數據,Java同步
- 2. 多線程 - 共享數據
- 3. 多線程共享/訪問相同數據的問題
- 4. 在java中的多線程共享數據
- 5. 在Java線程之間共享數據
- 6. 多個CComboBox共享相同的數據
- 7. Java:線程共享數據的框架
- 8. 阻止共享數據的Java線程?
- 9. Java多線程程序:多線程中的對象共享
- 10. 在C++中共享數據的線程
- 11. Java線程不共享靜態數據
- 12. java之間共享數據線程
- 13. 線程不共享相同的數據變量
- 14. C# - 多線程 - 共享數據
- 15. Java多線程共享同一對象的同步問題
- 16. C#線程共享數據
- 17. Perl線程共享數據
- 18. 多個應用程序共享相同的參考數據。 。
- 19. 多個應用程序,共享相同的數據目錄
- 20. C++/Windows多線程同步/數據共享
- 21. 在Java(OOP)中共享多個請求的相同實例
- 22. 如何在多個活動之間共享相同的數據
- 23. C++ - 在線程之間共享數據
- 24. 在多線程中共享數據 - 是非靜態變量嗎?
- 25. 在線數據共享
- 26. 在Java Web應用程序中共享相同的會話
- 27. 兩個不同的Java應用程序共享相同的數據庫
- 28. 在線程間共享幀緩衝區
- 29. 在同一個過程中多線程共享什麼?
- 30. 使用QAbstractTableModel中的多個線程之間共享的數據
加上'實現Runnable'你的類中,實現'運行()'方法,從那裏 –