Java'da yeniyim ve bir Eşzamanlı Programlama kursuna katılıyorum. Çaresiz bir şekilde, 'senkronize edilmiş' anahtar kelimeyi kullanmak ve bir nesneyi iş parçacıkları arasında paylaşmak gibi öğrendiğim kavramları göstermeye yardımcı olabilecek minimum bir çalışma örneği elde etmeye çalışıyorum. Arıyorsunuz, ancak temel bir çerçeve elde edilemedi. Java programcıları, yardım edin.İki iş parçacığı ile ana program arasındaki bir nesneyi paylaşma
9
A
cevap
4
İki iş parçacığı arasında bir diziyi paylaşmanın çok iyi bir örneği. Genellikle tüm sıfırları görürsünüz, ama bazen işler kötüleşir ve diğer sayıları görürsünüz.
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]);
}
Ama, her zaman baskı dışarı tüm 0
s göreceksiniz döngü etrafında arr
kilidinde eğer. Senkronize edilmiş bloğu beğenmezseniz, kod hatasız olarak çalışır.
7
Basit bir örnek. Umarım futbolu (ya da futbolu) seversin. :)
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;
}
}
İlgili konular
- 1. QML dosyaları arasındaki bir nesneyi paylaşma
- 2. İş parçacığı, iki iş parçacığı arasındaki iletişim C#
- 3. Ana iş parçacığı
- 4. Java'da main() yöntemi ve ana iş parçacığı arasındaki ilişki nedir?
- 5. Başvurulan bir nesneyi iş parçacığı genelinde kullanın
- 6. NSThread sleepfortimeinterval ana iş parçacığı
- 7. Uygulamalar arasında serileştirilmiş bir nesneyi paylaşma
- 8. AudioServicesPlaySystemSound ve ana iş parçacığı
- 9. NSMergeConflict (iki iş parçacığı) - birleştirme ilkesi ayarlandığında
- 10. Ana iş parçacığı neden bekler
- 11. Bir aramayı klonlamak, ana iş parçacığı
- 12. Bir BackgroundWorker ile ana iş parçacığı arasında nesne paylaşımı
- 13. İş parçacığı tanıtıcısı iş parçacığı tanıtıcısı
- 14. Bir CLR İşçi İş Parçacığı ile İşçi İş Parçacığı arasındaki fark nedir?
- 15. Ana iş parçacığı üzerinde kod yürütme zorlaması
- 16. UICollectionView bloklarını kilitleme ana iş parçacığı
- 17. Kinect ile iş parçacığı
- 18. Bir daemon iş parçacığı yalnızca
- 19. Ana iş parçacığı üzerinde hizmet nasıl çalıştırılır?
- 20. "Uyarı", ana() iş parçacığı içinde oluşturulmadı "
- 21. iOS ana iş parçacığı birkaç saniye donuyor
- 22. Parse.enableLocalDatastore() - Uyarı: Ana iş parçacığı üzerinde
- 23. Python işlevini yürütme Ana iş parçacığında Kukla iş parçacığı içinde yürütme Kukla iş parçacığı
- 24. Bir "gerçek" iş parçacığı
- 25. iPhone: İş parçacığının ana iş parçacığı nasıl belirlenir?
- 26. Diğer iş parçacıkları tamamlanıncaya kadar ana iş parçacığı nasıl engellenir?
- 27. Bir iş parçacığı özellikle blok
- 28. Ana İş Parçacığı Denetimi: Bir arka plan iş parçacığı üzerinde UI API çağrısı: - [UIApplication temsilci]
- 29. PLINQ neden sadece iki iş parçacığı kullanıyor?
- 30. React Bileşenleri Arasındaki Özellikleri Paylaşma
Ayrıca, sadece artırma ve eksiltme çizgileri için 'arr 'üzerinde senkronizasyon yaparak hataları ortadan kaldırabilirsiniz: http://pastebin.com/vN4E527P Bu, yalnızca iş parçacığı güvensiz parçaların bu iki satır olması gerçeğinin altını çizer. –
Bazen bir dizi rasgele sayı alıyorum. Şaşkınım. Çalışmayı açıklayabilir misiniz? – devnull
Arr [i% arr.length] - ve arr [i% arr.length] ++ aynı sayıda yürütülürken dengesiz mi olmalıdır? Başka bir deyişle sonuç her zaman sıfır olmamalıdır? – devnull