Jestem nowicjuszem w Javie i uczęszczam na kurs programowania współbieżnego. Rozpaczliwie staram się uzyskać minimalny przykład pracy, który może pomóc w zademonstrowaniu pojęć, których się nauczyłem, takich jak używanie słowa kluczowego "zsynchronizowanego" i dzielenie obiektu przez wątki. Szukałem, ale nie mogłem uzyskać podstawowej struktury. Programiści Java, proszę o pomoc.Udostępnianie obiektu między dwoma wątkami i głównym programem
9
A
Odpowiedz
4
Oto przykład bardzo udanego udostępnienia tablicy między dwoma wątkami. Zwykle zobaczysz wszystkie zera, ale czasami rzeczy stają się paskudne i widzisz inne liczby.
final int[] arr = new int[100];
Thread one = new Thread() {
public void run() {
// synchronized (arr) {
for (int i = 0; i < arr.length * 100000; i++) {
arr[i % arr.length]--;
}
// }
}
};
Thread two = new Thread() {
public void run() {
// synchronized (arr) {
for (int i = 0; i < arr.length * 100000; i++) {
arr[i % arr.length]++;
}
//}
}
};
one.start();
two.start();
one.join();
two.join();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
Ale jeśli synchronizacja na arr
wokół pętli będziesz zawsze zobaczyć wszystkie 0
S w wydruku. Jeśli odkomentujesz zsynchronizowany blok, kod będzie działał bez błędu.
7
Prosty przykład. Mam nadzieję, że lubisz piłkę nożną (lub piłkę nożną). :)
public class Game {
public static void main(String[] args) {
Ball gameBall = new Ball();
Runnable playerOne = new Player("Pasha", gameBall);
Runnable playerTwo = new Player("Maxi", gameBall);
new Thread(playerOne).start();
new Thread(playerTwo).start();
}
}
public class Player implements Runnable {
private final String name;
private final Ball ball;
public Player(String aName, Ball aBall) {
name = aName;
ball = aBall;
}
@Override
public void run() {
while(true) {
ball.kick(name);
}
}
}
public class Ball {
private String log;
public Ball() {
log = "";
}
//Removing the synchronized keyword will cause a race condition.
public synchronized void kick(String aPlayerName) {
log += aPlayerName + " ";
}
public String getLog() {
return log;
}
}
Powiązane problemy
- 1. Komunikacja między dwoma wątkami
- 2. SQLite: Udostępnianie połączeń między wątkami do odczytu i zapisu
- 3. Udostępnianie obiektu między plikami QML
- 4. Jaka jest różnica między wątkami i wątkami?
- 5. Udostępnianie 1 paska przewijania między dwoma DataGrids
- 6. Udostępnianie widoku między dwoma widokami reaguje natywnie
- 7. Udostępnianie kodu między dwoma projektami w git
- 8. Udostępnianie kodu między dwoma różnymi projektami git
- 9. Udostępnianie danych między dwoma Redux Reduktorami/państwami
- 10. Pamięć współdzielona między programem C++ i JS
- 11. Udostępnianie obiektu między pracownikami Gunicorn lub utrzymywanie obiektu wewnątrz pracownika
- 12. udostępnianie tabeli bazy danych między dwoma projektami django
- 13. C# komunikacja między wątkami
- 14. Komunikacja między wątkami w PySide
- 15. Ograniczenia dla środka i obiektu między dwoma obiektami
- 16. Udostępnianie zmiennych między plikami Makefile
- 17. Udostępnianie pamięci między modułami
- 18. Komunikacja między wątkami za pomocą funkcji SendMessage
- 19. Szybki mechanizm komunikacji między wątkami
- 20. Synchronizacja/wysyłanie danych między wątkami
- 21. jak udostępnić jedną transakcję między wieloma wątkami
- 22. Wysyłanie dużej ilości danych między wątkami Qt
- 23. Rozszerzenie chrome: udostępnianie obiektu między skryptami treści a skryptem tła
- 24. Udostępnianie pakietów Java między modułami w IntelliJ?
- 25. Udostępnianie danych między JVM
- 26. Udostępnianie zmiennej między procesami
- 27. Udostępnianie kodu modelu między Sinatra i Railsami
- 28. Udostępnianie danych między działaniami i usługami
- 29. Udostępnianie plików cookie między subdomenami i domeną
- 30. Udostępnianie kodu między fragmentami
Możesz także pozbyć się błędów, synchronizując w 'arr' tylko linie przyrostu i dekrementacji: http://pastebin.com/vN4E527P Podkreśla to fakt, że jedynymi niebezpiecznymi dla gwintów częściami są te dwie linie. –
Czasami otrzymuję ciąg liczb losowych. Jestem zdziwiony. Czy możesz wyjaśnić pracę? – devnull
Nie powinien arr [i% arr.length] - i arr [i% arr.length] ++ wyrównać, ponieważ jest wykonywany tyle samo razy? Innymi słowy, czy wynik nie powinien być zawsze zerowy? – devnull