Şimdi Ara

Java Threadlerle ilgili sorun

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
9
Cevap
0
Favori
387
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhaba,

    Threadleri dizilere alip(Thread thr=new Thread[10]) bu threadlerin her biri bir arabayi temsil edecek, son thread ise bir bisikleti olsun.Her iterasyonda belli miktar yol(her araba ve bisiklet icin ayri) gitsinler yaris 100 de bitsin diyelim.

    Sorun ben bu threadleri dogal olarak sadece bir kere baslatabiliyorum, threadlerin tuttugu sayma(gittimiz yol miktari) degerimiz kaybolucak, run methodun icine sizce nasil birsey yazmaliyim?

    -while-for dongusu olustursam ilk gelen thread icinde kaliyor,
    -Thread.sleep() diyorum diger threadi beklemiyor dogal olarak while-for kirilmasini gerek,
    -Bir method yazip kirdik diyelim bu seferde giden threadi bir daha baslatamiyoruz.
    -Baska sekilde mi thread olusturmaliyim?(implements,extends)

    internette buna benzer birsey yapanda yok, acaba boyle birsey olmaz mi?



    class mulyT{

    private int isim;
    private static int sayma;

    public mulyT(int isim, int sayma){
    this.isim=isim;
    this.sayma=sayma;
    }
    public void cagir(){
    Thread t1 = new Thread(new Runnable(){
    public void run(){
    //arabalar icin olsun
    }

    });
    Thread t2 = new Thread(new Runnable(){
    public void run(){
    //bisiklet icin olsun
    }
    });
    t1.start();
    t2.start();
    t1.join();
    t2.join();
    }
    }

    main{
    mulyT thr[] = new mulyT[10];
    for (int i = 0; i < thr.length; i++) {
    thr = new mulyT();
    thr.cagir();
    }



    < Bu mesaj bu kişi tarafından değiştirildi enes947 -- 21 Kasım 2018; 12:21:48 >







  • Anlattığından anladığım bu tarz bişiy istiyosun sanırım

     
    package codewars;

    public class Tests {

    public static void main(String[] args) throws Throwable {
    MyThread thr[] = new MyThread[10];
    for (int i = 0; i < thr.length - 1; i++) {
    thr[i] = new MyThread("araba" + i, 0);
    }
    thr[9] = new MyThread("bisiklet" + 9, 0); // bisiklet

    for (int i = 0; i < thr.length; i++) {
    thr[i].cagir();
    }

    }
    }

    class MyThread {

    private String isim;
    private int sayma;

    public MyThread(String isim, int sayma) {
    this.isim = isim;
    this.sayma = sayma;
    }

    public void cagir() {
    Thread t1 = null,t2 = null;
    if (isim.startsWith("bisiklet")) {
    t2 = new Thread(new Runnable() {
    public void run() {
    while(sayma < 100)
    sayma +=1;
    System.out.println(isim + " yarışı bitirdi");
    }
    });
    t2.start();
    } else {
    t1 = new Thread(new Runnable() {
    public void run() {
    while(sayma < 100)
    sayma +=3;
    System.out.println(isim + " yarışı bitirdi");
    }

    });
    t1.start();
    }
    }
    }



    Örnek çıktı:
     
    araba0 yarışı bitirdi
    araba1 yarışı bitirdi
    araba2 yarışı bitirdi
    araba3 yarışı bitirdi
    araba4 yarışı bitirdi
    araba5 yarışı bitirdi
    araba6 yarışı bitirdi
    araba7 yarışı bitirdi
    araba8 yarışı bitirdi
    bisiklet9 yarışı bitirdi




  • Car extends Thread.
    Bike extends Thread.
    ----
    Car[] cars = ....
    for each cars:
    car.start()
    ---
    car.join
    bike.join

    < Bu ileti tablet sürüm kullanılarak atıldı >
  • Cok teşekkürler, arabalar kendi icinde yarisiyor ama yanlis analiz etmediysem yazdiginiz kodda yarisi hicbir zaman bisiklet kazanamicak,(sayma+50 yapsak bile) problemimi biraz daha basitce anlatim.
    10 threadimizden 9 unu arabaya 1 tanesini bisiklete verelim ayni anda yarisa baslicaklar ilk iterasyondan itibaren adim adim gostermek istiyorum. Mesela 1.araba 10km, 2. araba 5km .. bisiklet 8km gitmis gibi ilk 100 yapanda yarisi kazanacak.



    < Bu mesaj bu kişi tarafından değiştirildi enes947 -- 21 Kasım 2018; 19:30:15 >
  • Mephalay M kullanıcısına yanıt
    Anlattiginizdan galiba boyle birsey yapmami onermissiniz, car threadini baslattigim for dongusu bitene kadar butun car threadi calistirip sonra bike threadini calistiriyor. Benim istedigim car threadleri ilk donguyu bitirdikten sonra bike threadini calistirip onunda degerini arttirmak ama o da olmaz cunku bike threadini bir kez calistirabiliyoruz. Yani ikisinide ayni thread dizisinde olusturup dizinin bir elemanini bike yapip calistirmaliyim yukaridaki arkadasin yaptigi gibi ama onda da sorun oluyor.


    class Car extends Thread{
    int b;
    public void run(){
    for (int i = 0; i < 10; i++) {
    System.out.println("Araba yarisa basladi " + ++b);
    }
    }

    }

    class Bike extends Thread{
    int i;
    public void run(){
    System.out.println("Bisiklet basladi " + ++i);
    }


    }

    public class Tests {

    public static void main(String[] args) throws InterruptedException{
    Car car[] = new Car[5];
    Bike bike = new Bike();

    for (int i = 0; i < car.length; i++) {
    car=new Car();
    car.start();
    Thread.sleep(500);
    }
    bike=new Bike();
    bike.start();
    for (int i = 0; i < car.length; i++) {
    car.join();
    }
    bike.join();

    }

    }




  • enes947 E kullanıcısına yanıt
    https://hastebin.com/lenuwelotu.java

    < Bu ileti tablet sürüm kullanılarak atıldı >
  • Mephalay M kullanıcısına yanıt
    Cok tesekkur ederim, yalniz bir seyi merak ettim kodu siz mi yazdiniz yoksa internette mi buldunuz eger internette bulduysaniz ne diye arama yaptiniz ben thread race yazinca %80 race condition ile ilgili bilgiler cikiyor.
  • rica ederim, ben yazdim.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.