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.
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"); }
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 >
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();
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.
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 Ol Şimdi DeğilÜ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.
< Bu mesaj bu kişi tarafından değiştirildi enes947 -- 21 Kasım 2018; 12:21:48 >