2015-10-01 8 views
5

Şu anda Java çoklu işlem kavramını anlamaya çalışıyorum. Tortoise ve Hare örneğini kullanarak çoklu okuma kavramını açıklayan bir öğreticiden geçtim ve büyük ölçüde video öğreticisinin sözdizimini ve mantığını anladım. Video öğreticinin sonunda, Youtuber bir Olimpiyat yarış pistine Multithreading uygulanmasını içeren bir ödev verdi.Diğer Konular bir iş parçacığı hedefine ulaştığında duruyor

Örnek bilgilerimi kullanarak, bir döngü içinde çalışan, 100 kez (100 metre) temsil eden 10 iş parçacığı (atletleri temsil eden) oluşturabiliyordum.

Benim sorunum, iş parçacığı zamanlayıcısı diğer 9 sporcudan 100 metre önce bir Sporcunun yapmasını sağladığında, kalan 9 iş parçacığı her zaman yarışlarını tamamlamaz. Bu standart bir yarış pistinde genellikle geçerli değildir. Usain Bolts adı verilen bir iş parçasının ilk olarak 100'e ulaşması, Yohan Blake'in o saatte 90 metrede koşması durumunda durması anlamına gelmez.

Ayrıca, her iş parçacığı için mesafeyi (hepsi aynı değişkeni kullandıklarını unutmayın) almakla ilgileniyorum, böylece her iş parçacığının konumunu, işin sonunda döndürmek için bir işlev kullanabilirim. Ben (işe yaramadı) ne yaptın

: 1) Yeni bir tamsayı değişkene her yürütme iş parçacığı mesafeyi atamak dokuz "Başka" deyimi içeren bir if else yapısı() kullanmak çalıştılar. (Thread.currentThread(). getName() özelliğini kullanarak ve her bir iş parçacığının adını) ancak bu benim için iyi çalışmadı. Bu, sporculara kendi mesafelerini kullanarak pozisyon vermeyi denedi, ancak yarışı bitirmeyen 9 sporcu hakkında hiçbir şey yapmadı.
2) Çalışma zamanında uzaklığı doldurmak için bir ArrayList kullanmaya çalıştım ama bazı garip nedenlerden dolayı bu, yine de başka bir mesafe eklemek istediğinde mesafenin üzerine yazıyor. Aşağıda

benim kodlardır:

package olympics100meters; 

import java.util.ArrayList; 

public class HundredMetersTrackRules implements Runnable { 
public static String winner; 

public void race() { 
for (int distance=1;distance<=50;distance++) { 
System.out.println("Distance covered by "+Thread.currentThread ().getName ()+" is "+distance+" meters."); 


boolean isRaceWon=this.isRaceWon(distance); 
if (isRaceWon) { 
ArrayList<Integer> numbers = new ArrayList(); 
numbers.add(distance); 
System.out.println("testing..."+numbers); 
break; 
} 

} 
} 


private boolean isRaceWon(int totalDistanceCovered) { 
    boolean isRaceWon=false; 
    if ((HundredMetersTrackRules.winner==null)&& (totalDistanceCovered==50)) { 
    String winnerName=Thread.currentThread().getName(); 
    HundredMetersTrackRules.winner=winnerName; 
    System.out.println("The winner is "+HundredMetersTrackRules.winner); 
    isRaceWon=true; 
    } 

    else if (HundredMetersTrackRules.winner==null) { 
    isRaceWon=false; 
    } 

    else if (HundredMetersTrackRules.winner!=null) { 
    isRaceWon=true; 
    } 
    return isRaceWon; 
} 

public void run() { 
this.race(); 
}  
} 

Bu (ı sorunlarını çözmek kadar 5 Sporcular için azaltılmış) benim ana yöntemdir:

public class Olympics100Meters { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    HundredMetersTrackRules racer=new HundredMetersTrackRules(); 
    Thread UsainBoltThread=new Thread(racer,"UsainBolt"); 
    Thread TysonGayThread=new Thread (racer,"TysonGay"); 
    Thread AsafaPowellThread=new Thread(racer,"AsafaPowell"); 
    Thread YohanBlakeThread=new Thread (racer,"YohanBlake"); 
    Thread JustinGatlinThread=new Thread (racer,"JustinGatlin"); 

    UsainBoltThread.start(); 
    TysonGayThread.start(); 
    AsafaPowellThread.start(); 
    YohanBlakeThread.start(); 
    JustinGatlinThread.start(); 

} 
} 
+0

Dizi listesi iş parçacığı güvenli değil. Eşzamanlı anahtar kelime normalde eşzamanlılık için kullanılan görmüyorum ... Ben arraylist dışında yarışı nasıl işlediğini göstermiyorum belki de engelleme veya güvenli bir şey kullanmak veya anahtar iş senkronize –

+2

kullanmak istiyorsanız Sağlam çoklu iş parçacığı kodu, kesinlikle iş parçacığı sınıf doğrudan adresleme kaçınmalısınız. Görevlerinizi tanımlamak için Runnable'ı kullanın ve bir ExecutorService aracılığıyla çalıştırılmasını sağlayın. Daha sonra yürütme akışını kontrol edebilecek ve koşulları durdurabileceksiniz. Net üzerinde ExecutorService kullanımlarının sayısız örnekleri vardır. – devlearn

+0

Teşekkür ederim. Ama bu programı doğrudan Thread sınıfını kullanarak yapmak istediğimi yapmamın bir yolu var mı? Multithreading'deki temel kavramlardan emin olmak istiyorum. –

cevap

0
  1. My meydan ... kalan 9 iplik her zaman yarışlarını tamamlamıyor.

Bu isRaceWon() yöntem uygulaması kaynaklanır. Her koşucuda her metrede kontrol et. İlk koşucu 100 metre ulaşır bitmez, break her koşucu döngünün sonraki adımda adlandırılır (ırk o java'nın bellek modeli önlemek için, kazananın adını volatile statuc String kullanmak mantıklı,

Btw her döngü için kazanılır belirsizlikler.

  1. Ben de sonunda her Konu pozisyonları dönmek için bir işlev kullanabilirsiniz, böylece her iş parçacığı için mesafe ... almakla ilgileniyorum yarışın

nihai amacı, pozisyon almak bir sınıf alanını public List<String> finishingOrder = new ArrayList<String> ve bir yöntem finish

private synchronized finish() { 
    finishingOrder.add(Thread.currentThread().getName()) 
} 

oluşturmak ve sonra onu aramak ise

yok döngü "koşmak" main'unuzdaki tüm koşucular için join()'u aramayı unutmayın. Bundan sonra, finishingOrder, bitirme sırasına göre isimler içerecektir.

0

aşağıda kod parçacığı paylaşılan winner alan boş olmayan şekilde ayarlandığı kısa sürede HundredMetersTrackRules her örneği için de geçerli dönmek için isRaceWon neden oluyor (birisi kazanır yani.):

else if (HundredMetersTrackRules.winner!=null) { 
    isRaceWon=true; 
} 

Bu içinde döndürme, Runnable öğenizin her örneği için kopmaya neden olan döngüye race() neden olur. İş parçacığının sonlandırılması, run() yönteminden çıkar.

Sorun sadece bir mantık hatasıdır ve gerçekten iş parçacığına özgü değildir. Ancak, diğer posterlerin de belirttiği gibi, iş parçacığı tarafından paylaşılan alanlar için volatile kullanılması gibi, bu kodda da kullanabileceğiniz bazı en iyi uygulama örneklerini bulabilirsiniz.

İlgili konular