Şimdi Ara

java timerlar hakkında bi sorunum var

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
5
Cevap
0
Favori
84
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • arkadaşlar ben şöyle bişey yazdım

    public class Main { 

    public static void main(String[] args) {

    A a = new A();
    a.baslat(0);
    a.baslat(1);
    a.baslat(2);
    a.baslat(3);

    }
    }
    public class A {

    public void baslat(int x)
    {
    Timer myTimer=new Timer();
    TimerTask gorev =new TimerTask() {
    int counter=0;
    @Override
    public void run() {

    System.out.println(x);
    counter++;
    if(counter>=10)
    myTimer.cancel();
    }
    };
    myTimer.schedule(gorev,0,300);
    }
    }


    main metoddaki komutları aynı anda yazdırıyo ve çıktı şöyle bişey oluyor: 0012030102030123001203012030
    ben ayrı ayrı yazdırmasını istiyorum yani 00000000000111111111111112222222222222223333333333
    gibi. Her sayıyı yazdırırken 300ms. bekliyor
    Bunu timerlarla ya da başka yöntemle nasıl yapabilirim? Benim için çok önemli bir sorun günlerdir bunla uğraşıyorum.







  • Ne yapmak istediğini anlayamadım

     System.out.println("00000000000111111111111112222222222222223333333333");
  • stroma44 kullanıcısına yanıt
    Merhaba. Aslında şu basit işlem işini görür:
     
    public class A {

    public void baslat(int x)
    {
    for (int i = 0; i < 10; i++) {
    System.out.println(x);
    try {
    Thread.sleep(300);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    }
  • Senin problemin "race condition" olusmasi. Sen thread leri sirayla baslatiyorsun ama basladigin sira ile execute etmiyorlar. Concurrent bir sekilde ilerlemelerini bekliyorsun ama malesef multi-thread de bu isi sansa birakiyorsun.
    Sync metod kullanman, atomic integer kullanman ya da semaphore vs gibi bir lock mekanizmasi kullanman gerekiyor.
    https://en.wikipedia.org/wiki/Race_condition
    https://en.wikipedia.org/wiki/Semaphore_(programming)
    Neden boyle bir kod yazdigini bilmiyorum, yeni bir timer baslattiginda bir oncekinin bitmesini beklemiyor. Thread.join() vs kullanabilirsin.Ornek cozum (busy-wait kullaniyor, daha iyisi yazilabilir ) :
     
    import java.util.Timer;
    import java.util.TimerTask;

    /**
    * Created by Mephalay on 8/31/2016.
    */
    public class TestMain {

    public static void main(String[] args) {
    A a = new A();
    a.baslat(0);
    while (!a.isDone()) ;
    a.baslat(1);
    while (!a.isDone()) ;
    a.baslat(2);
    while (!a.isDone()) ;
    a.baslat(3);

    }
    }

    class A {

    private volatile boolean done = false;

    public boolean isDone() {
    return done;
    }

    public void baslat(final int x) {
    done = false;
    final Timer myTimer = new Timer();
    TimerTask gorev = new TimerTask() {
    int counter = 0;

    @Override
    public void run() {

    System.out.print(x);
    counter++;
    if (counter >= 10) {
    done = true;
    myTimer.cancel();
    }
    }
    };
    myTimer.schedule(gorev, 0, 100);
    }
    }

    < Bu ileti tablet sürüm kullanılarak atıldı >




  • quote:

    Orijinalden alıntı: Mephalay

    Senin problemin "race condition" olusmasi. Sen thread leri sirayla baslatiyorsun ama basladigin sira ile execute etmiyorlar. Concurrent bir sekilde ilerlemelerini bekliyorsun ama malesef multi-thread de bu isi sansa birakiyorsun.
    Sync metod kullanman, atomic integer kullanman ya da semaphore vs gibi bir lock mekanizmasi kullanman gerekiyor.
    https://en.wikipedia.org/wiki/Race_condition
    https://en.wikipedia.org/wiki/Semaphore_(programming)
    Neden boyle bir kod yazdigini bilmiyorum, yeni bir timer baslattiginda bir oncekinin bitmesini beklemiyor. Thread.join() vs kullanabilirsin.Ornek cozum (busy-wait kullaniyor, daha iyisi yazilabilir ) :
     
    import java.util.Timer;
    import java.util.TimerTask;

    /**
    * Created by Mephalay on 8/31/2016.
    */
    public class TestMain {

    public static void main(String[] args) {
    A a = new A();
    a.baslat(0);
    while (!a.isDone()) ;
    a.baslat(1);
    while (!a.isDone()) ;
    a.baslat(2);
    while (!a.isDone()) ;
    a.baslat(3);

    }
    }

    class A {

    private volatile boolean done = false;

    public boolean isDone() {
    return done;
    }

    public void baslat(final int x) {
    done = false;
    final Timer myTimer = new Timer();
    TimerTask gorev = new TimerTask() {
    int counter = 0;

    @Override
    public void run() {

    System.out.print(x);
    counter++;
    if (counter >= 10) {
    done = true;
    myTimer.cancel();
    }
    }
    };
    myTimer.schedule(gorev, 0, 100);
    }
    }




    Adamsın :)

    < Bu ileti mobil sürüm kullanılarak atıldı >




  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.