Я новичок в Java, и я посещаю курс параллельного программирования. Я отчаянно пытаюсь получить минимальный рабочий пример, который может помочь продемонстрировать концепции, которые я узнал, используя «синхронизированное» ключевое слово и совместное использование объекта по потокам. Искали, но не смогли получить базовую структуру. Java-программисты, любезная помощь.Совместное использование объекта между двумя потоками и основной программой
9
A
ответ
4
Вот очень удачный пример совместного использования массива между двумя потоками. Обычно вы увидите все нули, но иногда все становится вялым, и вы видите другие цифры.
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]);
}
Но, если вы синхронизировать arr
вокруг цикла вы всегда будете видеть все 0
с в распечатке. Если вы раскомментируете синхронизированный блок, код будет работать без ошибок.
7
Простой пример. Надеюсь, вам понравится футбол (или футбол). :)
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;
}
}
Смежные вопросы
- 1. Совместное использование объекта между потоками
- 2. Совместное использование ArrayList между двумя потоками?
- 3. совместное использование объекта XPObject между потоками
- 4. Совместное использование mvar между потоками
- 5. Совместное использование объекта GoogleMaps между двумя действиями
- 6. Совместное использование объекта между двумя классами
- 7. Совместное использование stdout между несколькими потоками/процессами
- 8. PHP: Совместное использование статической переменной между потоками
- 9. Совместное использование измененных я между несколькими потоками
- 10. Совместное использование дескриптора файла между потоками
- 11. Совместное использование объекта между двумя потоками, использующими два разных метода. Android Java
- 12. Совместное восстановление ресурсов между потоками
- 13. Совместное использование сериализованного объекта между приложениями
- 14. Совместное использование объекта JavaVM между двумя процессами в Android
- 15. Совместное использование модели между двумя представлениями
- 16. Совместное использование проекта между двумя версиями
- 17. Совместное использование asp.net между двумя приложениями (vb)
- 18. Совместное использование TeamCity между двумя отдельными командами
- 19. Совместное использование цепочек между двумя приложениями .NET
- 20. Совместное использование сеанса между двумя сайтами
- 21. Совместное использование проекта между двумя решениями
- 22. Совместное использование ASP.NET Аутентификация между двумя приложениями
- 23. Совместное использование одной модели между двумя JComboBoxes
- 24. Совместное использование строк между двумя приложениями
- 25. Совместное использование репозитария между двумя Компьютеры
- 26. Совместное использование сеанса между двумя рельсами приложений
- 27. Совместное использование Sidekiq между двумя приложениями
- 28. Совместное использование одного stdout между двумя процессами в win32, C++
- 29. Совместное использование очереди между двумя отдельными потоками для получения и обработки данных в широковещательном сервере UDP
- 30. Переключение между двумя потоками
Вы также можете избавиться от ошибок, синхронизируя на 'arr' только строки инкремента и декремента: http://pastebin.com/vN4E527P. Это подчеркивает тот факт, что единственными небезопасными частями являются эти две строки. –
Иногда я получаю строку случайных чисел. Я озадачен. Можете ли вы любезно объяснить работу? – devnull
Не должно быть arr [i% arr.length] - и arr [i% arr.length] ++ балансировать, поскольку он выполняется столько же раз? Другими словами, не должен ли результат всегда равен нулю? – devnull