Arama butonu
Bu konudaki kullanıcılar: 1 misafir
7
Cevap
451
Tıklama
0
Öne Çıkarma
Java Threadlerle ilgili sorun
E
7 yıl
Çavuş
Konu Sahibi

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();
}

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil





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

H
7 yıl
Teğmen

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



M
7 yıl
Yarbay

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ı >
Bu mesaja 1 cevap geldi.
E
7 yıl
Çavuş
Konu Sahibi

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 >


Bu mesajda bahsedilenler: @hitman80
E
7 yıl
Çavuş
Konu Sahibi

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();

}

}


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Mephalay
M
7 yıl
Yarbay

https://hastebin.com/lenuwelotu.java



< Bu ileti tablet sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @enes947
E
7 yıl
Çavuş
Konu Sahibi

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.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Mephalay
M
7 yıl
Yarbay

rica ederim, ben yazdim.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.